给出一个项目列表,例如
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() ,怎么办呢?
谢谢!
你的方法是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)
它维护键现在插入字典的顺序.