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

时间:2014-02-11 07:51:19

标签: python list count

给出一个项目列表,例如

words = ['apple', 'apple', 'boat', 'cat', 'apple', 'cat']

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

for i in words:
    if words.count(i) == 3:
        print(i)

但这会打印“苹果”三次。如何让它只打印一次“苹果”?

编辑:这个程序会读很多单词,需要打印出列表中存储的三次,但是需要按相同的顺序打印,即我认为这意味着我无法使用set(),还能怎么做呢?

谢谢!

3 个答案:

答案 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])