2012-11-14 82 views
1

一個物品櫃比方說,我有一個Counter對象:Counter({'test': 2, 'this': 1, 'is': 1})遍歷由計數

我想遍歷這個對象通過以下方式:

c = Counter({'test': 2, 'this': 1, 'is': 1}) 

for i,s in my_counter_iterator(c): 
    print i, ":", s 

>> 1 : ['this', 'is'] 
>> 2 : ['test'] 

我如何做有效(這段代碼應該在每個請求的Web服務器上運行......)?

編輯

我都試過,但我有感覺有更有效的辦法。在那兒?

from itertools import groupby 

for k,g in groupby(sorted(c.keys(), key=lambda x: c[x]),key=lambda x: c[x]): 
    print k, list(g) 


1 ['this', 'is'] 
2 ['test'] 

回答

5

如果你想與大Counter s到做到這一點,你真的別無選擇,只能反轉的映射。

inv_c = defaultdict(list) 
for k, v in c.iteritems(): 
    inv_c[v].append(k) 

然後inv_c.iteritems()是你想要的。

+0

這比使用'groupby'進行排序和分組效率更高嗎? – zenpoy

+1

在漸近的意義上,是的。排序是O(nlogn),這個操作是O(n)。你的情況更快嗎?只有實驗才能告訴你。 :-) –

+0

當然是...它只需要兩倍的內存,但沒關係。 – zenpoy