2010-02-23 9 views
40

Si el valor es Ninguno, me gustaría cambiarlo a "" (cadena vacía).En Python, ¿cómo recorro el diccionario y cambio el valor si es igual a algo?

Empiezo como este, pero me olvide:

for k, v in mydict.items(): 
    if v is None: 
... right? 
+8

¿Es esta una parodia o un duende o un gag saltar-la-pistola el 1 de abril o un ejemplo de deficiencia gruesa en el sistema de "reputación" de SO? –

+2

Creo que sus comentarios generan más representantes para OP tbh. –

+6

@JohnMachin: No estoy seguro de por qué crees que se trata de un troll. Me pareció una pregunta útil, y aparentemente 17 personas están de acuerdo. Quería ver si podía actualizar un dict mientras lo iteraba, así que busqué en la web 'python iterate dict update values', lo que me llevó a esta pregunta. Incluye un comentario que me da la respuesta que estoy buscando. La gramática y el formato no son geniales, pero es una buena pregunta, digna de votos elevados. –

Respuesta

95
for k, v in mydict.iteritems(): 
    if v is None: 
     mydict[k] = '' 

En un caso más general, por ejemplo, Si agregas o quitas claves, puede que no sea seguro cambiar la estructura del contenedor en el que estás realizando un bucle, por lo que usar items para repetir una copia independiente de la lista puede ser prudente, pero asignar un valor diferente a una dado el índice existente no no incurrirá en ningún problema, entonces, en Python 2.any, es mejor usar iteritems.

+0

quizás s/index/key/ –

+0

@John, se aplica a _any_ built-in ** container ** - tanto como a una lista como a un dict - y creo que "index" es un término más genérico que "llave". –

+2

'mydict [k] = ''' - su ejemplo actualiza el índice 'k' a un objeto inmutable,' '' '. Entonces, después de esto, 'k' apuntaría a un objeto completamente diferente de' v'. ¿Esto mutaría el índice 'k' de alguna manera que podría causar problemas con' .iteritems() '? – CivFan

7

de comprensión son por lo general más rápido, y esto tiene la ventaja de no editar mydict durante la iteración:

mydict = dict((k, v if v else '') for k, v in mydict.items()) 
+0

Si está utilizando' .items() 'no importa (para python2) si modifica' mydict' como la lista que devuelve '.items()' no cambiará aunque agregue/elimine keys of 'mydict' –

+3

Cambiar solo los valores en un dict nunca es un problema; el dolor es causado al agregar/borrar LLAVES mientras se itera sobre el dict. Las comprensiones son más rápidas que ¿QUÉ? Muy rápido: copiando todo el dict cuando hay uno o dos Nones que cambiar. Hablando de Nones, deberías tener 'si v no es None' en lugar de' if v' (vuelve a leer la pregunta). Resumen general: -1 –

12

Se puede crear una comprensión dict de sólo los elementos cuyos valores son Ninguno, y luego actualizar de nuevo en el Original:

tmp = dict((k,"") for k,v in mydict.iteritems() if v is None) 
mydict.update(tmp) 

actualización - hicieron algunas pruebas de rendimiento

Bueno, después de probar los dictados de 100 a 10.000 elementos, con un porcentaje variable de valores Ninguno, el rendimiento de la solución de Alex es general dos veces más rápido que esta solución.

+0

Hmm, para Python 2.7 Veo el mismo rendimiento (aunque el método de Alex es siempre más rápido); He intentado dictados con 1000 ... 100000 valores y ninguno porcentaje de 2 a 50 %%; para comparación, el método de [buckley] (http://stackoverflow.com/a/2315545/558008) (con s/items/iteritems /) fue aproximadamente 4 veces más lento. Creo que esto es algo interesante, ya que su formulario le permite a uno alterar el diccionario en la iteración. –

Cuestiones relacionadas