从python的Counter()multiset字典中删除唯一键的最有效方法

时间:2014-02-02 01:56:33

标签: python counter multiset

我发现python中的Counter()函数非常有用,它有一个内置的Counter.most_common()函数,可以按照从最常见到最不常见的顺序返回键。但是我没有找到build_in函数来过滤掉所有唯一的,或者超出/低于外观阈值的键。这对字典组合来说并不太难,但看起来像是一个常见的功能,我想知道(a)为什么它不是内置的,和(b)我做过想念它?

我的方法,给出了一些数据:

x = ['904692239', '904692239', '416618990', '965059531', '904692239', '48644135', '904692239', '386210409', '978527886', '102666625', '793573909', '826761606', '980035897', '837619792', '709804744', '703248895', '904692239', '843796438', '633621488', '374214079', '904692239', '218851385', '359342704', '793949601', '793949601', '216731638', '793949601', '721831814', '715338006', '466865724', '160977579', '971821714', '715338006', '612216206', '658467007', '67897613', '255688245', '457452213', '457452213', '984706137', '160977579', '160977579', '503944932', '261444687', '95794369', '286082560', '974609408', '457408015', '376428770', '636170296', '636170296', '636170296', '721831814']
from collections import Counter
y = Counter(x)
non_uniques = [k for k,v in Counter(x).items() if v > 1]
>>>non_uniques
['715338006', '457452213', '904692239', '160977579', '793949601', '636170296', '721831814']

这是最有效的方法吗? (获取列表并过滤掉该列表中所有非唯一事件)

1 个答案:

答案 0 :(得分:1)

不,没有内置方法,这通常不是必需的。

您可以使用itertools.takewhile()获取所有“唯一”键:

from itertools import takewhile

for unique in takewhile(lambda pair: p[1] == 1, reversed(y.most_common())):

或所有非独特的:

for unique in takewhile(lambda pair: p[1] > 1, y.most_common()):

这两种方法都需要完整的字典,所以你自己的方法,只循环一次,也很好。