2011-01-11 10 views

Respuesta

19

Esto debe hacerlo:

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

maldito. vencerme a la respuesta - stachoverflow solo me permite publicar una respuesta cada 3 minutos – tekknolagi

+1

+1 FWIW Prefiero pop a del – inspectorG4dget

+2

No es buena idea, en general, mutar algo sobre lo que estás iterando - y en Python 3, ' keys' es un 'dictview' no una lista. – agf

4

¿Qué tal algo como esto:

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

Eso no elimina las claves del dict. Crea una nueva dict sin las claves, en cambio. – nosklo

+1

Es interesante que haya sentido la necesidad de votar por abajo además de proporcionar su propia respuesta. Creo que el pedantismo está vivo y bien, ¿eh? Me pregunto (sin haberlo probado) si eliminar de la lista existente es * más rápido * que crear uno nuevo. Esa fue en realidad su pregunta principal. –

+2

No te he votado, pero (1) @nosklo es correcto (2) la palabra es "pedantería" (3) omitiste mencionar que el código debe diferir entre 2.x y 3.x (iteritems vs. items) (4) los corchetes son redundantes en Python moderno (5) si es más rápido o no será influenciado por cuántas teclas comienzan con 's_' –

2

Se puede utilizar un diccionario por comprensión en Python 3:

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

Esta sintaxis similar en Python 2 hace lo mismo:

dict((k, v) for k, v in dic.items() if not k.startswith("s_")) 

Tenga en cuenta que ambos crean un nuevo diccionario (que puede asignar de nuevo a dic si lo desea) en lugar de mutar el diccionario existente.

+0

Eso no elimina las claves del dict. Crea una nueva dict sin las claves, en cambio. – nosklo

+0

No veo cómo está mal, ya que la pregunta no especificaba mutar el diccionario en su lugar. –

+2

La pregunta específicamente solicita eliminar las claves del dict. – nosklo

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

+1 Sin embargo, FWIW prefiero pop al – inspectorG4dget

+12

pero 'del' es la forma preferida y es más rápido. Es decir, "a = {'x': 1}; a.pop ('x')" toma 0.286 μsec por ciclo mientras que "a = {'x': 1}; del a ['x']" solo toma 0.178 μsec por ciclo. –

+6

No solo eso, también es semánticamente mejor. 'del' dice que desea eliminar la entrada mientras' pop' le dice que desea recuperarla. Entonces en este caso prefiero del pop. ;) – johndodo

1

con Python 3 para evitar el error:

RuntimeError: dictionary changed size during iteration 

Esto debe hacerlo:

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