2013-04-07 6 views

risposta

14

No, è necessario rimuoverli manualmente. Utilizzando itertools.dropwhile() fa che un po 'più facile, forse:

from itertools import dropwhile 

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

Dimostrazione:

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

Utilizzando dropwhile avete solo bisogno di testare le chiavi per i quali il conteggio è 15 o sopra; dopo di ciò, rinuncerà ai test e passerà attraverso tutto. Ciò funziona alla grande con l'elenco ordinato most_common(). Se ci sono molti valori inferiori a 15, ciò consente di risparmiare tempo di esecuzione per tutti quei test.

+0

non vedo il punto in 'dropwhile' per questo caso – jamylak

+0

anche' 'bar'' non dovrebbero essere eliminati in quanto la sua frequenza non è inferiore a 15. In realtà questa idea può funzionare in in un modo diverso, ma non proprio per cancellare le chiavi. per esempio. 'new_dict = dict (takewhile (lambda x: x [1]> = 15, main_dict.most_common()))' – jamylak

+0

@jamylak: 'dropwhile' interrompe il test una volta interrotta la corrispondenza; per un gran numero di chiavi che fa la differenza. Approfondirò l'errore più tardi. –

4

Un altro metodo:

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

Perché '.elements()' su '.items()', quest'ultimo sarebbe più veloce – jamylak

+0

@jamylak Perché '.items' restituisce una tupla e quando viene restituito a' Counter' finisce con una tupla di coppie chiave/valore con un valore di '1' (penso - colpa a tarda notte e pranzo al pub) –

+2

OK, o si potrebbe anche fare questo:' Contatore ({k: c per k, c in c.items() se 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

mi permetto di suggerire un'altra soluzione

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

Anche io ho lo stesso problema, ma ho bisogno di restituire un elenco di tutte le chiavi dal Contatore con valori più di qualche soglia. Per fare questo

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

>>> ['baz', 'bar'] 
Problemi correlati