Python - Llenar diccionarios con listas

   
Vista:

Llenar diccionarios con listas

Publicado por victor (1 intervención) el 17/11/2009 13:28:14
Tengo un problema. Quiero rellenar un diccionario en el que cada key se le asigna una lista que va rellenandose en cada iteracion a partir de los valores de otro diccionario que transformo.

Lo pongo con el ejemplo para que quede mas claro:

Parto del siguiente diccionario de nombre photos:

{'4105505664': ['hockey', 'video juegos'], '4097533527': ['paris', 'videojuegos'], '4097528257': ['paris', 'videojuegos'], '4098283140': ['paris', 'videojuegos'], '4098273356': ['paris', 'videojuegos']}

La idea es cojer cada valor de la key del diccionario y transofrmalo en la key del nuevo diccionario, que tendrá como valores los diferentes id de las fotos guardados en una lista. Pues hago lo siguiente:

def transformDict(photos):
result={}
listids=[]
for idphoto in photos:
for tag in photos[idphoto]:
result.setdefault(tag, [])
listids.append(result[tag])
listids.append(idphoto)
result[tag] = listids
listids=[]
return result

El resultado de esto es:

{'paris': [[[[[], '4097533527'], '4097528257'], '4098283140'], '4098273356'], 'videojuegos': [[[[[], '4097533527'], '4097528257'], '4098283140'], '4098273356'], 'hockey': [[], '4105505664'], 'video juegos': [[], '4105505664']}

No es exactamente lo que quiero, ya que aqui se van añadiendo listas dentro de listas, debido a la instruccion result.setdefault(tag, []) que crea una lista por defecto en cada key, pero sin esta línea no funciona.

Me gustaría tener un resultado del estilo:

{'paris': ['4097533527', '4097528257', '4098283140', '4098273356'], 'videojuegos': ['4097533527', '4097528257', '4098283140', '4098273356', 'hockey': ['4105505664'], 'video juegos': ['4105505664']}

Alguna solucion? Gracias

Víctor
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

(SOLUCIONADO) RE:Llenar diccionarios con listas

Publicado por víctor (1 intervención) el 17/11/2009 13:37:43
SOLUCIONADO:

Sólo cogiendo la lista que ya estaba creada por defecto (result) y añadir el valor (idphoto) en la lista se soluciona el problema y no hace falta crear una lista auxiliar como mi listids.
Había hecho pruebas del estilo pero sin la línea result.setdefault(tag, []), entonces el problema era que cuando hacia un result[tag].append(idphoto) me decía que el append no se podía realizar porque result[tag] no era una lista.

La solucion sería esta:

def transformDict(photos):
result={}
listids=[]
for idphoto in photos:
for tag in photos[idphoto]:
result.setdefault(tag, [])
result[tag].append(idphoto)
return result

Y efectivamente muestra el resultado deseado:

{'paris': ['4097533527', '4097528257', '4098283140', '4098273356'], 'videojuegos': ['4097533527', '4097528257', '4098283140', '4098273356'], 'hockey': ['4105505664'], 'video juegos': ['4105505664']}

Espero que os sirva a los que deseéis rellenar diccionarios con listas que van cambiando sus valores.

Saludos

Víctor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar