3

在 python 中,如果我有两个字典,特别是看起来像这样的 Counter 对象

c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})

我可以组合这些字典,以便结果是一个列表字典,如下所示:

c3 = {'item1': [4,6], 'item2':[2,2], 'item3': [5,1], 'item4': [3], 'item5': [9]}

其中每个值是来自适当键的前面字典的所有值的列表,并且在两个原始字典之间没有匹配键的情况下,添加一个包含一个元素列表的新 kew。

4

3 回答 3

8
from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
c3 = {}
for c in (c1, c2):
    for k,v in c.iteritems():
        c3.setdefault(k, []).append(v)

c3就是现在:{'item1': [4, 6], 'item2': [2, 2], 'item3': [5, 1], 'item4': [3], 'item5': [9]}

于 2012-07-24T13:42:53.147 回答
2

或者使用列表理解:

from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
merged = {}
for k in set().union(c1, c2):
    merged[k] = [d[k] for d in [c1, c2] if k in d]

>>> merged
{'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6], 'item4': [3], 'item5': [9]}

解释

  1. 将所有存在的键放入匿名集中。(这是一个集合 => 没有重复的键)
  2. 对于每个键,执行 3。
  3. 对于字典列表中的每个字典 d[c1, c2]
    • 检查当前正在处理的key是否k存在
      • d[k]如果为真:在结果列表中包含表达式
      • 如果不是:继续下一次迭代

这里有很多例子对列表理解的详细介绍。

于 2012-07-24T14:23:05.903 回答
1

您可以使用defaultdict

>>> from collections import Counter, defaultdict
>>> c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
>>> c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
>>> c3 = defaultdict(list)
>>> for c in c1, c2:
...     for k, v in c.items():
...         c3[k].append(v)
... 
>>> c3
defaultdict(<type 'list'>, {'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6],
'item4': [3], 'item5': [9]})
于 2012-07-24T15:31:27.993 回答