python-优化字典的创建

我有一个ID称为ID的列表. id中的每个元素都是一个字符串.一个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列表不太长,则效果很好.但是,对于较长的列表,性能相当差.

我怎样才能使它更快?

解决方法:

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

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']}
上一篇:c#-确定扑克牌同花顺


下一篇:java-如何在if else语句中简化此类重复的代码?