首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化词典创作

优化词典创作
EN

Stack Overflow用户
提问于 2017-07-13 09:12:52
回答 1查看 113关注 0票数 3

我有一个ids名为ids的列表。ids中的每个元素都是一个字符串。在此列表中,可以多次存在一个id

我的目标是创建一个字典,它将出现的次数作为键,值是经常出现的ids的列表。我目前的做法如下:

代码语言:javascript
运行
复制
from collections import defaultdict
import numpy as np
ids = ["foo", "foo", "bar", "hi", "hi"]
counts = defaultdict(list)
for id in np.unique(ids):
    counts[ids.count(id)].append(id)

输出:

代码语言:javascript
运行
复制
print counts
--> defaultdict(<type 'list'>, {1: ['bar'], 2: ['foo', 'hi']})

如果if列表不太长,这将很好地工作。但是,对于更长的列表来说,性能相当差。

我怎样才能让这个更快?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 09:16:52

不要为列表中的每个元素调用count,而是为整个列表创建一个collections.Counter

代码语言:javascript
运行
复制
ids = ["foo", "foo", "bar", "hi", "hi"]
counts = defaultdict(list)
for i, c in Counter(ids).items():
    counts[c].append(i)
# counts: defaultdict(<class 'list'>, {1: ['bar'], 2: ['foo', 'hi']})

如果您喜欢单行行,也可以组合Counter.most_common (用于查看按计数排序的元素)和itertools.groupby (但我不这么认为)。

代码语言:javascript
运行
复制
>>> {k: [v[0] for v in g] for k, g in groupby(Counter(ids).most_common(), lambda x: x[1])}
{1: ['bar'], 2: ['foo', 'hi']}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45076268

复制
相关文章

相似问题

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