2011-01-11 20 views

risposta

19

Questo dovrebbe farlo:

for k in dic.keys(): 
    if k.startswith('s_'): 
    dic.pop(k) 
+0

maledettamente. battimi alla risposta: stachoverflow mi consente di pubblicare una sola risposta ogni 3 minuti – tekknolagi

+1

+1 FWIW Preferisco il pop al – inspectorG4dget

+2

Non è una buona idea, in generale, mormorare qualcosa su cui stai iterando e su Python 3, ' keys' è un 'dictview' non una lista. – agf

4

Che ne dite di qualcosa di simile:

dic = dict([(x,y) for x,y in dic.items() if not x.startswith('s_')]) 
+1

Che non rimuove le chiavi dal dict. Invece crea un nuovo dict senza le chiavi. – nosklo

+1

È interessante che tu sentissi il bisogno di votare meno oltre a fornire la tua risposta. Immagino che il pedantismo sia vivo e vegeto, eh? Mi chiedo (non averlo provato) se rimuovere dall'elenco esistente è effettivamente * più veloce * che ne crea uno nuovo. Questa era in realtà la sua domanda principale. –

+2

Non ho votato, ma (1) @nosklo è corretto (2) la parola è "pedanteria" (3) hai omesso di menzionare che il codice dovrebbe differire tra 2.xe 3.x (iteritems vs items) (4) le parentesi quadre sono ridondanti nel moderno Python (5) se è più veloce o meno sarà influenzato da quanti tasti iniziano con 's_' –

2

è possibile utilizzare una comprensione dizionario in Python 3:

{k: v for k, v in dic.items() if not k.startswith("s_")} 

Questa sintassi simile a Python 2 fa la stessa cosa:

Nota che entrambi creano un nuovo dizionario (che puoi assegnare a dic se preferisci) anziché modificare il dizionario esistente.

+0

Ciò non rimuove le chiavi dal dett. Invece crea un nuovo dict senza le chiavi. – nosklo

+0

Non vedo come sia sbagliato, poiché la domanda non specificava la modifica del dizionario. –

+2

La domanda chiede in particolare di rimuovere le chiavi dal comando. – nosklo

17
for k in dic.keys(): 
    if k.startswith('s_'): 
     del dic[k] 
+0

+1 Tuttavia, FWIW preferisco pop a del – inspectorG4dget

+12

ma 'del' è il metodo preferito ed è più veloce. Cioè, "a = {'x': 1}; a.pop ('x')" prende 0,286 μsec per ciclo mentre "a = {'x': 1}; del a ['x']" richiede solo 0,178 μsec per loop. –

+6

Non solo, è anche semanticamente migliore. 'del' dice che desideri rimuovere la voce mentre' pop' ti dice che desideri recuperarlo. Quindi in questo caso preferisco del pop. ;) – johndodo

1

con Python 3 per evitare l'errore:

RuntimeError: dictionary changed size during iteration 

Questo dovrebbe farlo:

list_keys = list(dic.keys()) 
for k in list_keys: 
    if k.startswith('s_'): 
    dic.pop(k) 
Problemi correlati