Сравнение словарей в Python

Учитывая два словаря, d1 и d2, и целое число l, я хочу найти все ключи k в d1, такие как d2[k]<l или k not in l. Я хочу вывести ключи и соответствующие значения в d2, за исключением случаев, когда d2 не содержит ключа, я хочу напечатать 0. Например, если d1 - это

a: 1
b: 1
c: 1
d: 1

и d2 - это

a: 90
b: 89
x: 45
d: 90

а l - 90, вывод будет (возможно, в другом порядке)

b 89
c 0

Как лучше всего это сделать в Python? Я только начинаю изучать язык, и пока вот что у меня есть:

for k in d1.keys():
    if k not in d2:
        print k, 0
    else:
        if d2[k]<l:
            print k, d2[k]

Это, конечно, работает (если у меня нет опечатки), но мне кажется, что есть более питонический способ сделать это.

В первом абзаце вы имеете в виду «k не в d2» вместо «k не в l»?

dF. 12.01.2009 06:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
1
10 272
4

Ответы 4

Вы можете упростить это, используя defaultdict. Вызов __getitem__ для defaultdict вернет значение «по умолчанию».

from collections import defaultdict
d = defaultdict(int)
print d['this key does not exist'] # will print 0

Еще один момент, который вы могли бы изменить, - это не вызывать ключи. Словарь реализует iter. Лучше просто написать:

for k in d1:

Ваш на самом деле в порядке - вы можете упростить его до

for k in d1:
    if d2.get(k, 0) < l:
       print k, d2.get(k, 0)

который (для меня) питонический и в значительной степени является прямым «переводом» в код вашего описания.

Если вы хотите избежать двойного поиска, вы можете сделать

for k in d1:
    val = d2.get(k, 0)
    if val < l:
        print k, val

Вот компактная версия, но у вас все в порядке:

from collections import defaultdict

d1 = {'a': 1, 'b': 1, 'c': 1, 'd': 1}
d2 = {'a': 90, 'b': 89, 'x': 45, 'd': 90}
l = 90

# The default (==0) is a substitute for the condition "not in d2"
# As daniel suggested, it would be better if d2 itself was a defaultdict
d3 = defaultdict(int, d2)
print [ (k, d3[k]) for k in d1 if d3[k] < l ]

Выход:

[('c', 0), ('b', 89)]

Это действительно +1 для Дэниела

Federico A. Ramponi 12.01.2009 07:20

Ваш достаточно хорош, но вот тот, который немного проще:

for k in d1:
    val = d2.get(k, 0)
    
    if val < l:
        print k, val
        

Другие вопросы по теме