Python 优化词典的创建

Python 优化词典的创建,python,optimization,Python,Optimization,我有一个ID为ids的列表。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): count

我有一个ID为
ids
的列表。
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']})
打印计数
-->defaultdict(,{1:['bar'],2:['foo','hi']})
如果ID列表不太长,那么这种方法很有效。但是,对于较长的列表,性能相当差


我怎样才能使它更快

不要为列表中的每个元素调用
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']})

你真的需要NumPy吗?您可以将
用于set(ids)
中的id。此外,您所做的工作与
收藏几乎相同。计数器
,也许您可以查看这些想法。
>>> {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']}