2017-08-16 46 views
0

我包含几个标记不同频率的列表对象工作筛选标记基于频率

from collections import Counter 

s = {'book', 
'car', 
'bird', 
'cup', 
'book', 
'cup', 
'river'} 

print(Counter(s)) 

[('book': 2), ('cup': 2), ('river': 1), ('car': 1), ('bird': 1)] 

我想订出仅出现两次令牌将被选择的过滤器,并我使用我当前的尝试下面的代码

select = [word for word in s if list(s).count(word) >= 2] 
select 

我认为这是非常简单的,但我没有从任何输出“选择”。我的代码出了什么问题,以及如何处理它?

+4

您显示* set *,它将只有每个唯一值*一次*。请给[mcve];请注意,堆栈片段适用于HTML/CSS/JS,并且不支持Python。 – jonrsharpe

回答

1

如果s列表,而不是一组(就像你在你的问题中写道,而不是在您的示例代码),你可以使用Counter对象的most_common函数来获取顶级X元素在您的列表:

In [67]: s = ['book', 
    ...: 'car', 
    ...: 'bird', 
    ...: 'cup', 
    ...: 'book', 
    ...: 'cup', 
    ...: 'river'] 

In [68]: s 
Out[68]: ['book', 'car', 'bird', 'cup', 'book', 'cup', 'river'] 

In [69]: c = Counter(s) 

In [70]: c.most_common(2) 
Out[70]: [('book', 2), ('cup', 2)] 

在你想出现超过y倍的元素,你可以使用情况:

In [71]: [x[0] for x in c.items() if x[1] >= 2] 
Out[71]: ['book', 'cup'] 

x[0]是项目(f从列表中删除)和x[1]是频率

+0

这不是我想要的原因,'.most_common()'只是对它们进行排名。 –

+0

检查答案 – Dekel

+0

@ChrisT中的更新。你检查过更新吗? – Dekel