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) ...

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top