我正在制作一个列表单词计数器,并试图合并两个每个字符都有计数器的词典,但我一直得到错误的输出。以下是我试图弄清楚的原因。除了字典里的最后两个键外,一切似乎都很顺利。
counts = {"a": 1, "p": 2, "l": 1, "e": 1}
new_counts = {"h": 1, "e": 1, "l": 2, "o": 1}
counts.update(new_counts)
for letters in counts:
if letters in counts and new_counts:
counts[letters] += 1
else:
counts[letters] = 1
print(counts)
我需要什么:
{"a": 1, "p": 2, "l": 3, "e": 2, "h": 1, "o": 1}
我得到的:
{'a': 2, 'p': 3, 'l': 3, 'e': 2, 'h': 2, 'o': 2}
您可以使用一个简单的for循环:
counts = {"a": 1, "p": 2, "l": 1, "e": 1}
new_counts = {"h": 1, "e": 1, "l": 2, "o": 1}
for k, v in new_counts.items():
if k in counts:
counts[k] += v
else:
counts[k] = v
print(counts) # => {'a': 1, 'p': 2, 'l': 3, 'e': 2, 'h': 1, 'o': 1}
这实际上是最快的方法。我用timeit
对kosciej16的答案进行了测试,他的答案花了5.49秒,而我的答案花了0.73秒(一百万次迭代(。我还测试了wim的字典理解答案,这需要1.95秒,而我的答案需要0.85秒。
如果我们在Python结构中,实际上它是一个理想的Counter
。
from collections import Counter
c1 = Counter({"a": 1, "p": 2, "l": 1, "e": 1})
c2 = Counter({"h": 1, "e": 1, "l": 2, "o": 1})
print(c1 + c2)
这将是使用collections.defaultdict
的理想场所。创建一个新的defaultdict
,我们对两个字典的项进行迭代,并将它们的值添加到defaultdict
中。
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> counts = {"a": 1, "p": 2, "l": 1, "e": 1}
>>> new_counts = {"h": 1, "e": 1, "l": 2, "o": 1}
>>> for k, v in counts.items():
... d[k] += v
...
>>> for k, v in new_counts.items():
... d[k] += v
...
>>> d
defaultdict(<class 'int'>, {'a': 1, 'p': 2, 'l': 3, 'e': 2, 'h': 1, 'o': 1})