Сравнение словарей в Python - PullRequest
5 голосов
/ 12 января 2009

Учитывая два словаря, 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]

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

Ответы [ 3 ]

10 голосов
/ 12 января 2009

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

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
4 голосов
/ 12 января 2009

Вы можете упростить это, используя 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:
2 голосов
/ 12 января 2009

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

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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...