Eliminar elementos de un conjunto mientras se itera sobre él.

Tengo un conjunto de myset , y tengo una función que se itera sobre él para realizar alguna operación en sus elementos y esta operación finalmente elimina el elemento del conjunto.

Obviamente, no puedo hacerlo mientras todavía estoy iterando sobre el conjunto original. Yo puedo, sin embargo, hacer esto:

 mylist = list(myset) for item in mylist: # do sth 

¿Hay alguna forma mejor?

Primero, usando un set, como Zero Piraeus nos dijo, puedes

 myset = set([3,4,5,6,2]) while myset: myset.pop() print myset 

Agregué un método de impresión dando estas salidas.

 >>> set([3, 4, 5, 6]) set([4, 5, 6]) set([5, 6]) set([6]) set([]) 

Si desea atenerse a su elección para una lista, le sugiero que haga una copia profunda de la lista utilizando una comprensión de la lista, y haga un bucle sobre la copia, mientras elimina los elementos de la lista original. En mi ejemplo, hago que la longitud de la lista original disminuya en cada bucle.

 l = list(myset) l_copy = [x for x in l] for k in l_copy: l = l[1:] print l 

da

 >>> [3, 4, 5, 6] [4, 5, 6] [5, 6] [6] [] 

Esto debería funcionar:

 while myset: item = myset.pop() # do something 

O, si necesita eliminar elementos condicionalmente:

 def test(item): return item != "foo" # or whatever myset = set(filter(test, myset)) 

Devolvamos todos los números pares mientras modificamos el conjunto actual.

 myset = set(range(1,5)) myset = filter(lambda x:x%2==0, myset) print myset 

Volverá

 >>> [2, 4] 

Si hay una oportunidad de uso, utilice siempre lambda para que su vida sea más fácil.

Otra forma podría ser:

 s=set() s.add(1) s.add(2) s.add(3) s.add(4) while len(s)>0: v=next(iter(s)) s.remove(v)