我有一个字符串列表:
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)
一个非常简单的答案是您应该在第二个解决方案中替换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)