我有一个名为ids
的ID列表。 ids
中的每个元素都是一个字符串。一个id
可以在此列表中多次存在。
我的目标是创建一个字典,其中出现次数为关键字,值为经常出现的ID列表。 我目前的方法如下:
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)
输出:
print counts
--> defaultdict(<type 'list'>, {1: ['bar'], 2: ['foo', 'hi']})
如果id列表不太长,这很有效。但是,对于较长的列表,性能相当糟糕。
如何让它更快?
答案 0 :(得分:4)
不是为列表中的每个元素调用count
,而是为整个列表创建collections.Counter
:
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
(但我宁愿不会)
>>> {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']}