2012-11-14 118 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