resueltos - Iteración del diccionario de Python
listas en python (2)
Tengo un diccionario dict2
que quiero recorrer y eliminar todas las entradas que contengan ciertos números de identificación en idlist
. dict2[x]
es una lista de listas (vea el ejemplo dict2 a continuación). Este es el código que he escrito hasta ahora, sin embargo, no elimina todas las instancias de los ID ( entry[1]
) que están en la lista de idlist
. ¿Alguna ayuda?
dict2 = {G1:[[A, ''123456'', C, D], [A, ''654321'', C, D], [A, ''456123'', C, D], [A, ''321654'', C, D]]}
idlist = [''123456'',''456123'',''321654'']
for x in dict2.keys():
for entry in dict2[x]:
if entry[1] in idlist:
dict2[x].remove(entry)
if dict2[x] == []:
del dict2[x]
dict2
debería terminar pareciéndose a esto:
dict2 = {G1:[[A, ''654321'', C, D]]}
¿Probar una versión más limpia tal vez?
for k in dict2.keys():
dict2[k] = [x for x in dict2[k] if x[1] not in idlist]
if not dict2[k]:
del dict2[k]
Un enfoque que usa conjuntos (tenga en cuenta que necesitaba cambiar sus variables A, B, C, etc. a cadenas y los números en su lista de identificación a números enteros reales; también esto solo funciona, si sus ID son únicas y no aparecen en otros ''campos''):
#!/usr/bin/env python
# 2.6 <= python version < 3
original = {
''G1'' : [
[''A'', 123456, ''C'', ''D''],
[''A'', 654321, ''C'', ''D''],
[''A'', 456123, ''C'', ''D''],
[''A'', 321654, ''C'', ''D''],
]
}
idlist = [123456, 456123, 321654]
idset = set(idlist)
filtered = dict()
for key, value in original.items():
for quad in value:
# decide membership on whether intersection is empty or not
if not set(quad) & idset:
try:
filtered[key].append(quad)
except KeyError:
filtered[key] = quad
print filtered
# would print:
# {''G1'': [''A'', 654321, ''C'', ''D'']}