2017-07-13 62 views
3

我有一個名爲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

你真的需要NumPy嗎?您可以使用'for set(ids)'中的id來代替。另外,你做的和'collections.Counter'幾乎一樣,也許你可以考慮一下想法。 – ForceBru

回答

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']}