2010-05-10 23 views
12

Estoy tratando de construir un diccionario que contiene una serie de conjuntos:Eliminar ciertas claves de un diccionario en Python

{Field1:{Value1, Value2, Value3}, Field2{Value4}} 

El problema es que yo desee entonces para eliminar cualquier campo del diccionario que sólo tiene un valor en el conjunto. He estado escribiendo código como este:

for field in FieldSet: 
    if len(FieldSet[field]) == 1: 
     del(FieldSet[field]) 

Pero recibe el error "RuntimeError: tamaño del diccionario cambiado durante la ejecución". (No es sorprendente, ya que eso es lo que estoy haciendo.) No es el todo y el final si tengo que unir algún tipo de solución alternativa, pero ¿es posible hacer esto?

Respuesta

22

Iterate el valor de retorno de .keys() en su lugar. Ya que recupera una lista de claves, no se verá afectada al cambiar el diccionario después de haberlo llamado.

+1

Es decir, reemplace la primera línea con esto: 'para el campo en FieldSet.keys():' – Smashery

+2

En realidad estoy usando python3, por lo que la línea corregida fue: para el campo en la lista (FieldSet.keys ()): – Margaret

+0

No debería ser necesario convertir a una lista en este caso. – monkut

14

Una alternativa a veces preferible cambiar FieldSet en su lugar es a veces (dependiendo de la cantidad de manipulación de los equipos) para construir una nueva y vincularlo al nombre existente:

FieldSet = dict((k, v) for k, v in FieldSet.iteritems() 
       if len(v) != 1) 
1

No es el método pop . Elimina el elemento que llama una tecla. Con respecto a su ejemplo será similar a:

for field in FieldSet.keys(): 
    if len(FieldSet[field]) == 1: 
     FieldSet.pop(field) 

Esto es en Python 3.2, pero no estoy seguro de si es una característica nueva: http://docs.python.org/dev/library/stdtypes.html#dict.pop

Sólo probé y funciona como se anuncia.

Cuestiones relacionadas