首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将两个或多个计数器合并到一个字典中?

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

Stack Overflow用户
提问于 2015-12-22 19:24:56
回答 3查看 1.3K关注 0票数 4

我有两个计数器集合C1和C2,它们有相似的数据集,但计数不同(假设C1和C2是一组人拥有的苹果和橘子的数量)。

我想把这两个集合合并成一个看起来像

代码语言:javascript
复制
{
Person1: [1, 2],
Person2: [5, 1],
...
}

我还没有决定存储合并计数(也许是列表)的数据结构,以便轻松地将它们写入csv文件,#Appleand橙是单独的列。在python集合中有很多我不知道的技巧,我正在寻找最小的代码大小。谢谢。

编辑:从下面的答案中,我觉得我的问题不像我想的那么清楚,让我详细说明我到底想要什么:让我有两个计数器集合c1和c2:

代码语言:javascript
复制
c1 = [
  ('orange', 10),
  ('apple', 20)
]

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

我想将这两个集合合并到一个dict中,这样看起来如下:

代码语言:javascript
复制
merged = {
  'orange': [10, 15],
  'apple': [20, 30]
}

或其他数据结构,可以很容易地转换和输出到csv格式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-22 19:53:21

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

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2015-12-22 19:56:23

利用大熊猫:

代码语言:javascript
复制
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')

如果计数器的密钥不完全相同,这也是有效的。会有钥匙只出现在另一个柜台的NaNs。

票数 2
EN

Stack Overflow用户

发布于 2021-02-04 11:23:27

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

代码语言:javascript
复制
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并添加计数器。

代码语言:javascript
复制
c1 = Counter(['orange'] * 10 + ['apple'] * 20)
c2 = Counter(['orange'] * 15 + ['apple'] * 30 + ['banana']* 5)
c = c1 + c2

现在我们可以将计数器写到csv文件中。

代码语言:javascript
复制
df = pd.DataFrame.from_dict(c, orient='index', columns=['count'])
df.to_csv('counts.csv')

还有一种方法是将计数器集合转换为dicts,然后在那里形成Counters,因为您正在寻找一个小的代码大小。

代码语言:javascript
复制
c1 = Counter(dict([('orange', 10),('apple', 20)]))
c2 = Counter(dict([('orange', 15),('apple', 30),('banana',5)]))
c = c1 + c2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34423051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档