合并两个字典值(如果它们具有相同的键)



我正在制作一个列表单词计数器,并试图合并两个每个字符都有计数器的词典,但我一直得到错误的输出。以下是我试图弄清楚的原因。除了字典里的最后两个键外,一切似乎都很顺利。

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

相关内容

  • 没有找到相关文章

最新更新