按频率过滤字符串列表

Jac*_*cky 2 python list

我有一个字符串列表:

a = ['book','book','cards','book','foo','foo','computer'] 
Run Code Online (Sandbox Code Playgroud)

我想返回此列表中的所有内容x > 2

最终输出:

a = ['book','book','book']
Run Code Online (Sandbox Code Playgroud)

我不太确定如何解决这个问题。但我想到了两种方法:


方法一:

我创建了一个字典来计算某个项目出现的次数:

a = ['book','book','cards','book','foo','foo','computer'] 

import collections

def update_item_counts(item_counts, itemset):
    for a in itemset:
        item_counts[a] +=1

test = defaultdict(int)
update_item_counts(test, a)
print(test)

Out: defaultdict(<class 'int'>, {'book': 3, 'cards': 1, 'foo': 2, 'computer': 1})
Run Code Online (Sandbox Code Playgroud)

我想用这本词典过滤掉列表,但我不知道该怎么做。


方法二:我尝试编写一个列表理解,但它似乎不起作用:

res = [k for k in a if a.count > 2 in k]
Run Code Online (Sandbox Code Playgroud)

Oli*_*çon 5

一个非常简单的答案是您应该在第二个解决方案中替换a.count为。a.count(k)

不过,不要尝试list.count这样做,因为这将遍历每个项目的列表。相反,首先使用 来计算出现次数collections.Counter。这样做的优点是只需遍历列表一次。

from collections import Counter
from itertools import repeat

a = ['book','book','cards','book','foo','foo','computer']
count = Counter(a)

output = [word for item, n in count.items() if n > 2 for word in repeat(item, n)]

print(output) # ['book', 'book', 'book']
Run Code Online (Sandbox Code Playgroud)

请注意,列表理解等效于下面的循环。

output = []

for item, n in count.items():
    if n > 2:
        output.extend(repeat(item, n))
Run Code Online (Sandbox Code Playgroud)