2013-04-07 11 views

答えて

14

いいえ、手動で削除する必要があります。

from itertools import dropwhile 

for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()): 
    del main_dict[key] 

デモンストレーション:itertools.dropwhile()を使用すると、その少し簡単に、おそらくになり、あなただけカウントが15以上であるためにキーをテストする必要がありdropwhileを使用することにより

>>> main_dict 
Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
>>> for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()): 
...  del main_dict[key] 
... 
>>> main_dict 
Counter({'baz': 20, 'bar': 15}) 

を。その後、テストを控え、すべてを通過するだけです。それはソートされたmost_common()リストでうまくいきます。 15よりも多くの値があると、それらのテストの実行時間が節約されます。

+0

を行うには、私は、その周波数が15以上であるので、この場合 – jamylak

+0

ため 'dropwhile'のポイントはまた' 'bar''が実はこのアイデアはで動作する可能性があり、削除すべきではありませんが表示されません別の方法ですが、本当にキーを削除することはできません。例えば。 'new_dict = dict(takewhile(lambda x:x [1]> = 15、main_dict.most_common()))' – jamylak

+0

@jamylak: 'dropwhile'はマッチを止めるとテストを中止します。違いを生む多数のキーのために。後でこのエラーを調査します。 –

4

別の方法:

c = Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
print Counter(el for el in c.elements() if c[el] >= 15) 
# Counter({'baz': 20, 'bar': 15}) 
+0

'.items()'に '.elements()'が使われているのはなぜでしょうか?後者はもっと速くなります – jamylak

+0

@jamylak '.items'はタプルを返し、' Counter'に返されたときにキーと値のペアの値が '1'であると考えています(遅い夜とパブのランチを非難します) –

+2

また、次のようにしてもかまいません:' Counter({k:c for c、c.items() c> = 15}) ' – jamylak

6
>>> main_dict = Counter({'apple': 20, 'orange': 14, 'mango': 26, 'banana': 12}) 
>>> for k in list(main_dict): 
     if main_dict[k] < 15: 
      del main_dict[k] 


>>> main_dict 
Counter({'mango': 26, 'apple': 20}) 
0

が、私は別のソリューション

from collections import Counter 
main_dict = Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
trsh = 15 

main_dict = Counter(dict(filter(lambda x: x[1] >= trsh, main_dict.items()))) 
print(main_dict) 

>>> Counter({'baz': 20, 'bar': 15}) 

を提案することができる。また、私は同じ問題を抱えているが、私は値でカウンターからすべてのキーのリストを返す必要がありますいくつかの閾値以上。この

keys_list = map(lambda x: x[0], filter(lambda x: x[1] >= trsh, main_dict.items())) 
print(keys_list) 

>>> ['baz', 'bar'] 
関連する問題