2013-04-07 9 views

Odpowiedz

14

Nie, musisz usunąć je ręcznie. Korzystanie itertools.dropwhile() sprawia, że ​​trochę łatwiej może:

from itertools import dropwhile 

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

Demonstracja:

>>> 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}) 

Korzystając dropwhile, wystarczy przetestować klucze, w których liczba wynosi 15 lat; po tym zrezygnuje z testowania i po prostu przejdzie przez wszystko. Działa to świetnie z posortowaną listą most_common(). Jeśli jest dużo wartości poniżej 15, to oszczędza czas wykonania wszystkich tych testów.

+0

Nie widzę sensu w 'dropwhile' dla – jamylak

+0

także' 'bar'' nie powinien być usunięty tym przypadku, ponieważ jego częstotliwość wynosi nie mniej niż 15. To właśnie ta idea może pracować w w inny sposób, ale tak naprawdę nie do usuwania kluczy. na przykład. 'new_dict = dict (takewhile (lambda x: x [1]> = 15, main_dict.most_common()))' – jamylak

+0

@jamylak: 'dropwhile' przestaje testować, gdy przestanie pasować; dla dużej liczby kluczy, która robi różnicę. Zbadam błąd później. –

4

Inna metoda:

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

Dlaczego '.elements()' over '.items()', ta ostatnia byłaby szybsza – jamylak

+0

@jamylak Ponieważ '.items' zwraca krotkę, a po powrocie do' Counter' kończy się krotką pary klucz/wartość o wartości "1" (myślę - winę późną nocą i lunch w pubie) –

+2

Dobrze, albo możesz to zrobić: 'Counter ({k: c dla k, c in c.items() if 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

mogę zasugerować inne rozwiązanie

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}) 

Również mam ten sam problem, ale muszę zwrócić listę wszystkich kluczy z licznika z wartościami więcej niż pewien próg. Aby to zrobić

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

>>> ['baz', 'bar'] 
Powiązane problemy