如何将两个或多个计数器合并为一个字典?

时间:2015-12-22 19:24:57

标签: python list dictionary

我有两个Counter系列C1和C2,他们有相似的数据集,但计数不同(认为C1和C2是一群人拥有的苹果和橙子的数量)。

我想将这两个集合合并为一个看起来像

的字典
{
Person1: [1, 2],
Person2: [5, 1],
...
}

我还没有决定用什么数据结构存储合并计数(可能是列表),以便轻松地将它们写入csv文件,其中苹果和橙子是单独的列。在python集合中有很多我不知道的技巧,我正在寻找最小的代码大小。感谢。

编辑:从下面的答案中,我觉得我的问题不像我想的那么清楚,让我详细说明我在寻找什么: 让我有两个Counter集合c1和c2:

c1 = [
  ('orange', 10),
  ('apple', 20)
]

c2 = [
  ('orange', 15),
  ('apple', 30)
]

我想将这两个集合合并为一个单独的dict,如下所示:

merged = {
  'orange': [10, 15],
  'apple': [20, 30]
}

或其他可以轻松转换并输出为csv格式的数据结构。

3 个答案:

答案 0 :(得分:1)

您可以使用defaultdict()模块中的collections来存储合并后的结果,然后使用chain()模块中的itertoolschain在这里做的是它使一个迭代器返回每个“计数器”中的元素,让你避免编写一个嵌套循环。

>>> from collections import defaultdict
>>> from itertools import chain
>>> c1 = [
...   ('orange', 10),
...   ('apple', 20)
... ]
>>> c2 = [
...   ('orange', 15),
...   ('apple', 30)
... ]
>>> merged = defaultdict(list)
>>> for item in chain(c1, c2):
...     merged[item[0]].append(item[1])
... 
>>> merged
defaultdict(<class 'list'>, {'apple': [20, 30], 'orange': [10, 15]})
>>> 

答案 1 :(得分:1)

使用pandas:

import pandas as pd
from collections import Counter

c1 = Counter('jdahfajksdasdhflajkdhflajh')
c2 = Counter('jahdflkjhdazzfldjhfadkhfs')


df = pd.DataFrame({'apples': c1, 'oranges': c2})
df.to_csv('apples_and_oranges.csv')

如果计数器的键不完全相同,这也适用。会有NaN,其中密钥只出现在另一个柜台中。

答案 2 :(得分:0)

如果您按照指定的方式从计数器集合开始,则可以使用 Counter.update() 函数。我还添加了项目 banana,它仅在一个柜台集合中。请注意,在 update 上使用的 Counter 会将值添加到键中。这与在 update 上使用的 dict 形成对比,其中值被更新替换 (!)(检查文档:https://docs.python.org/3/library/collections.html#collections.Counter.update)。

from collections import Counter
import pandas as pd

c1 = [('orange', 10),('apple', 20)]
c2 = [('orange', 15),('apple', 30),('banana',5)]
c = Counter()
for i in c1: c.update({i[0]:i[1]})
for i in c2: c.update({i[0]:i[1]})

但是,如果您从一个值列表开始,您可以为每个列表构造一个 Counter 并添加计数器

c1 = Counter(['orange'] * 10 + ['apple'] * 20)
c2 = Counter(['orange'] * 15 + ['apple'] * 30 + ['banana']* 5)
c = c1 + c2

现在我们可以将计数器写入 csv 文件

df = pd.DataFrame.from_dict(c, orient='index', columns=['count'])
df.to_csv('counts.csv')

另一种方法是将计数器集合转换为 dicts 并将其形成为 Counters,因为您正在寻找较小的代码大小

c1 = Counter(dict([('orange', 10),('apple', 20)]))
c2 = Counter(dict([('orange', 15),('apple', 30),('banana',5)]))
c = c1 + c2