2017-08-16 65 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