鉴于两个词典d1
和d2
以及整数l
,我想在k
中找到所有键d1
,以便d2[k]<l
1}}或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]
这当然是有效的(除非我有一个错字),但在我看来,会有更多的pythonic方式。
答案 0 :(得分:10)
你的确很好 - 你可以把它简化为
for k in d1:
if d2.get(k, 0) < l:
print k, d2.get(k, 0)
这对我来说是pythonic,并且几乎是对你的描述代码的直接“翻译”。
如果你想避免双重查询,你可以做
for k in d1:
val = d2.get(k, 0)
if val < l:
print k, val
答案 1 :(得分:4)
您可以使用defaultdict简化此操作。在defaultdict上调用__getitem__将返回“default”值。
from collections import defaultdict
d = defaultdict(int)
print d['this key does not exist'] # will print 0
你可以改变的另一点是不要调用键。该词典实现了 iter 。最好简单地写一下:
for k in d1:
答案 2 :(得分:2)
这是一个紧凑版本,但你的完全没问题:
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)]
答案 3 :(得分:0)
您的水平足够好,但是这里有些简单:
for k in d1:
val = d2.get(k, 0)
if val < l:
print k, val