Convertir una lista de tuplas en un Dict en Python
-
06-07-2019 - |
Pregunta
Tengo una lista de tuplas como esta:
[
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
Quiero iterar a través de esta incrustación por el primer elemento, por lo que podría imprimir algo como esto:
a 1 2 3
b 1 2
c 1
¿Cómo podría hacer esto sin mantener un elemento para rastrear si el primer elemento es el mismo que hago un círculo alrededor de las tuplas? Esto se siente bastante desordenado (además tengo que ordenar la lista para comenzar) ...
Solución
l = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
d = {}
for x, y in l:
d.setdefault(x, []).append(y)
print d
produce:
{'a': [1, 2, 3], 'c': [1], 'b': [1, 2]}
Otros consejos
Ligeramente más simple ...
>>> from collections import defaultdict
>>> fq= defaultdict( list )
>>> for n,v in myList:
fq[n].append(v)
>>> fq
defaultdict(<type 'list'>, {'a': [1, 2, 3], 'c': [1], 'b': [1, 2]})
Una solución usando groupby
>>> from itertools import groupby
>>> l = [('a',1), ('a', 2),('a', 3),('b', 1),('b', 2),('c', 1),]
>>> [(label, [v for l,v in value]) for (label, value) in groupby(l, lambda x:x[0])]
[('a', [1, 2, 3]), ('b', [1, 2]), ('c', [1])]
groupby (l, lambda x: x [0]) le proporciona un iterador que contiene ['a', [('a', 1), ...], c, [('c', 1) ], ...]
Imprimir lista de tuplas agrupadas por el primer elemento
Esta respuesta se basa en el @gommen one .
#!/usr/bin/env python
from itertools import groupby
from operator import itemgetter
L = [
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]
key = itemgetter(0)
L.sort(key=key) #NOTE: use `L.sort()` if you'd like second items to be sorted too
for k, group in groupby(L, key=key):
print k, ' '.join(str(item[1]) for item in group)
Salida:
a 1 2 3
b 1 2
c 1
Simplemente haría lo básico
answer = {} for key, value in list_of_tuples: if key in answer: answer[key].append(value) else: answer[key] = [value]
Si es tan corto, ¿por qué usar algo complicado? Por supuesto, si no le importa usar setdefault, también está bien.