5

给定两个字典,d1andd2和一个 integer l,我想找到这样的k所有键or 。我想输出 中的键和对应的值,除非如果不包含键,我想打印 0。例如,如果是d1d2[k]<lk not in ld2d2d1

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 的方式来做这件事。

4

4 回答 4

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
于 2009-01-12T03:50:58.217 回答
4

您可以通过使用 defaultdict 来简化此操作。在 defaultdict 上调用 __getitem__ 将返回“默认”值。

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

您可以更改的另一点是不调用键。字典实现了iter。最好简单地写:

for k in d1:
于 2009-01-12T03:43:45.547 回答
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)]
于 2009-01-12T04:15:41.053 回答
0

你的已经足够好了,但这里有一个更简单的:

for k in d1:
    val = d2.get(k, 0)
    
    if val < l:
        print k, val
        
于 2020-09-24T06:06:00.850 回答