Учитывая два словаря, 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]
Это, конечно, работает (если у меня нет опечатки), но мне кажется, что есть более питонический способ сделать это.






Вы можете упростить это, используя 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 для Дэниела
Ваш достаточно хорош, но вот тот, который немного проще:
for k in d1:
val = d2.get(k, 0)
if val < l:
print k, val
В первом абзаце вы имеете в виду «k не в d2» вместо «k не в l»?