打印列表中出现一定次数的项目?

Hay*_*aas 0 python list count

给出一个项目列表,例如

words = ['apple', 'apple', 'boat', 'cat', 'apple', 'cat']
Run Code Online (Sandbox Code Playgroud)

我可以计算每个元素的出现次数.我只想打印出列表中的元素三次,即在'apple'上面的列表中出现三次,所以我希望打印它.目前这是我的代码:

for i in words:
    if words.count(i) == 3:
        print(i)
Run Code Online (Sandbox Code Playgroud)

但这会打印"苹果"三次.如何让它只打印一次"苹果"?

编辑:这个程序将会读很多单词,并且需要打印出列表中存储的三次,但是它们需要以相同的顺序打印,即我认为这意味着我不能使用set() ,怎么办呢?

谢谢!

the*_*eye 7

你的方法是O(N ^ 2),但这可以用O(N)来解决.

from collections import Counter
print [key for key, count in Counter(words).items() if count == 3]
Run Code Online (Sandbox Code Playgroud)

在此解决方案中,Counter(words)将查找列表中所有项目的频率.如果您打印Counter对象,它将是这样的

Counter({'apple': 3, 'cat': 2, 'boat': 1})
Run Code Online (Sandbox Code Playgroud)

这是在O(N)中完成的,然后我们迭代该对象以找到其值为的所有键3.这又是O(N).

仅仅为了完整起见,我发布了简单的字典版本

counter = {}
for word in words:
    counter[word] = counter.get(word, 0) + 1
print [key for key, count in counter.items() if count == 3]
Run Code Online (Sandbox Code Playgroud)

dict.get方法将查找字典中的第一个参数.如果找到,它将返回与之对应的值.否则,它将返回第二个参数(默认值).

编辑:

正如评论部分所述,如果您希望保留订单,您可以collections.OrderedDict像这样使用

from collections import OrderedDict
counter = OrderedDict()
words = ['cat', 'apple', 'apple', 'boat', 'cat', 'apple', 'cat']
for word in words:
    counter[word] = counter.get(word, 0) + 1
print [key for key, count in counter.items() if count == 3]
Run Code Online (Sandbox Code Playgroud)

产量

['cat', 'apple']
Run Code Online (Sandbox Code Playgroud)

它维护键现在插入字典的顺序.