给出一个项目列表,例如
words = ['apple', 'apple', 'boat', 'cat', 'apple', 'cat']
我可以计算每个元素的出现次数。我只想打印出列表中的元素三次,即在'apple'上面的列表中出现三次,所以我希望打印它。目前这是我的代码:
for i in words:
if words.count(i) == 3:
print(i)
但这会打印“苹果”三次。如何让它只打印一次“苹果”?
编辑:这个程序会读很多单词,需要打印出列表中存储的三次,但是需要按相同的顺序打印,即我认为这意味着我无法使用set(),还能怎么做呢?
谢谢!
答案 0 :(得分:7)
你的方法是O(N ^ 2),但这可以用O(N)来解决。
from collections import Counter
print [key for key, count in Counter(words).items() if count == 3]
在此解决方案中,Counter(words)
将查找列表中所有项目的频率。如果您打印Counter对象,它将是这样的
Counter({'apple': 3, 'cat': 2, 'boat': 1})
这在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]
dict.get
方法将查找字典中的第一个参数。如果找到,它将返回与之对应的值。否则,它将返回第二个参数(默认值)。
修改强>
正如comments section中所述,如果您希望保留订单,可以使用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]
<强>输出强>
['cat', 'apple']
它维护键现在插入字典的顺序。
答案 1 :(得分:1)
Python有一个内置的set
函数,可以从列表中删除重复项。您可以像这样修改代码:
for i in set(words):
if words.count(i) == 3:
print(i)
或者你可以使用列表理解,因为我现在已经被告知它被称为:
[print(i) for i in set(words) if words.count(i)==3]
这是有效的,因为set(words)
仅返回words
的唯一元素,但它不会影响words.count(i)
的结果。
答案 2 :(得分:0)
您可以使用一套。
set([word for word in words if words.count(word) == 3])