2009-08-05 20 views
30

Estoy buscando una manera de convertir lista de tuplas que tiene este aspecto:Python: lista de tuplas en la conversión en un diccionario

[(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 

en un diccionario, donde la clave: valor de par miradas como este:

{4:[1,2,3] ,15:[4,5,9,11,12], 23:[6,7,8,10]} 

El segundo elemento de una tupla se convierte en una clave de diccionario. El primer elemento de tupla se asigna a esa clave.

¿Me puede mostrar cómo eso se puede hacer?

+1

¿Por qué quieres una lista de diccionarios en cada diccionario tiene una sola clave/valor? ¿Estás seguro de que no solo quieres un diccionario? – FogleBird

+0

Sí, tenías razón FogleBird. Estaba buscando diccionario eventualmente. Gracias por señalarlo ... – elfuego1

+21

A juzgar por el número de puntos de vista, la mayoría de la gente (como yo) llegamos aquí buscando cómo convertir 'myList = [(key1, val1), (clave2, val2), ...] 'a dict:' {key1: val1, key2: val2 ...} '. Para ello, basta con hacer 'dict (miLista)' – mindthief

Respuesta

43
>>> from collections import defaultdict 
>>> l= [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> d= defaultdict(list) 
>>> for v, k in l: 
...  d[k].append(v) 
... 
>>> d 
defaultdict(<type 'list'>, {23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]}) 
>>> [ {k:d[k]} for k in sorted(d) ] 
[{4: [1, 2, 3]}, {15: [4, 5, 9, 11, 12]}, {23: [6, 7, 8, 10]}] 
+0

1 para el uso de defaultdict. Mucho más suave que llamar 'setdefault()' cada vez. –

+0

Love collections.defaultdict. es mi clase para mucho trabajo. – hughdbrown

2
l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = {} 
for v, k in l: 
    d.setdefault(k, []).append(v) 
+0

Mediante la copia de mi uso de setdefault en su edición, ahora hay menos opciones para los votantes para elegir ... – FogleBird

+2

Realmente no copiarlo. Me di cuenta de que podía usar setdefault también después de publicarlo y actualizarlo por correo porque me gustaba más. – c089

+0

No hay problema. No está mal editar para agregar otras ideas de todos modos, pero por lo general está hecho para agregar más información, no para crear una respuesta duplicada. Pero entiendo que no copiaste el mío. – FogleBird

2
tuples = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
dicts = {} 
for elem in tuples: 
    try: 
     dicts[elem[1]].append(elem[0]) 
    except KeyError: 
     dicts[elem[1]] = [elem[0],] 
+1

Utilice desempacar en su bucle for. Y no hay necesidad de una coma en una lista de un solo elemento (solo tuplas). Y usar una excepción aquí está más bien en Python que en otros idiomas, pero todavía es un poco tonto en este caso. – FogleBird

+2

La excepción no es tonto - es cómo defaultdict lo hace. Estoy de acuerdo sobre el desempaquetado sin embargo. – xorsyst

12
>>> a = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
>>> b = {} 
>>> for i, j in a: 
...  b.setdefault(j, []).append(i) 
... 
>>> b 
{23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]} 
>>> 
+0

¡Muchas gracias! – elfuego1

+0

¡Brillante! Acabo de enterarme de una nueva operación dict hoy: setdefault. ¡Eso arreglará un poco mi código! Aclamaciones. +1 –

+3

@Steve Folly: mira collections.defaultdict. Es incluso mejor. –

2

Esto va a hacer:

from collections import defaultdict 

def to_list_of_dicts(list_of_tuples): 
    d = defaultdict(list) 
    for x, y in list_of_tuples: 
     d[y].append(x) 
    return sorted([{x: y} for (x, y) in d.items()]) 
2

No es lujoso, pero es sencillo

l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)] 
d = dict((k, [i[0] for i in l if i[1] == k]) for k in frozenset(j[1] for j in l)) 

Hurra!

Cuestiones relacionadas