比较Python中的词典

2024-05-12 19:32:10 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个字典d1d2,以及一个整数l,我想在d1中找到所有键k,以便d2[k]<lk 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]

当然可以(除非我有错别字),但在我看来,会有一种更像Python的方式来做这件事。


Tags: 方法in语言forif字典顺序not
3条回答

这是一个紧凑的版本,但你的完全可以:

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)]

你的其实很好——你可以把它简化成

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

对我来说,这是一种Python,几乎是直接“翻译”成你描述的代码。

如果你想避免双重查找,你可以

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

您可以使用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:

相关问题 更多 >