2011-03-08 9 views
10

Cómo convertir la lista de dict a dict. A continuación se muestra la lista de dictcómo convertir la lista de dict a dict

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}] 

a

data = {{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}} 
+1

Trate de poner su segunda línea en un script Python y ejecutarlo. ¿Incluso se ejecutará correctamente? No lo creo ... –

+13

Su pregunta realmente no tiene sentido como se publicó. ¿Qué quieres que sean las claves y los valores asociados de tu dict resultante? Lo segundo que escribió no es un objeto Python válido. – dfan

+0

http://docs.python.org/tutorial/datastructures.html#dictionaries –

Respuesta

24

Una solución posible utilizando nombres como las nuevas claves:

new_dict = {} 
for item in data: 
    name = item['name'] 
    new_dict[name] = item 

Con 3.x pitón también se puede utilizar para comprensiones dict el mismo enfoque de una manera más agradable:

new_dict = {item['name']:item for item in data} 

Como se sugiere en un comentario de Paul McGuire, si no desea que el nombre en el dict interno, que puede hacer:

new_dict = {} 
for item in data: 
    name = item.pop('name') 
    new_dict[name] = item 
+1

que dejará un campo de nombre adicional, que puede o no puede ser lo que el usuario desea. (es decir, el nuevo diccionario se ve como '{'Lisa Simpson': {'nombre': 'Lisa Simpson', 'edad': 17, 'sexo': 'F'} ...}') –

+0

add "item. pop ('nombre') "después de asignar el nombre, y luego no obtendrá el campo de nombre adicional. – PaulMcG

+0

sí, no nombro como extra al campo. – sush

1

Tal vez desea que el nombre a ser la llave? Realmente no especificas, ya que tu segundo ejemplo no es válido y no es realmente significativo.

Nota que mi ejemplo, se quita el "nombre" clave del valor, que puede ser deseable (o tal vez no).

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}] 
newdata = {} 
for entry in data: 
    name = entry.pop('name') #remove and return the name field to use as a key 
    newdata[name] = entry 
print newdata 
##{'Bill Clinton': {'age': 57, 'sex': 'M'}, 
## 'John Doe': {'age': 37, 'sex': 'M'}, 
## 'Lisa Simpson': {'age': 17, 'sex': 'F'}} 
print newdata['John Doe']['age'] 
## 37 

También tenga en cuenta que Lisa es mucho más joven que 17, así que ni siquiera piense en tocarlo. ;)

+0

Eso depende de cómo interpretes Simpsons Time. Después de todo, si ella tenía 8 años cuando comenzó el espectáculo en 1989, tendría 29 o 30 hoy ... :-) –

15

Si los dicts molestaría comparten clave, entonces se podría usar:

dict([(key,d[key]) for d in data for key in d] 

Probablemente es mejor en su caso, para generar un diccionario con las listas como valores?

newdict={} 
for k,v in [(key,d[key]) for d in data for key in d]: 
    if k not in newdict: newdict[k]=[v] 
    else: newdict[k].append(v) 

Esto produce:

>>> newdict 
`{'age': [37, 17, 57], 'name': ['John Doe', 'Lisa Simpson', 'Bill Clinton'], 'sex': ['M', 'F', 'M']}` 
Cuestiones relacionadas