Uso itertools.groupby:
import itertools
import operator
data=[(1, 'A', 'foo'),
(2, 'A', 'bar'),
(100, 'A', 'foo-bar'),
('xx', 'B', 'foobar'),
('yy', 'B', 'foo'),
(1000, 'C', 'py'),
(200, 'C', 'foo'),
]
for key,group in itertools.groupby(data,operator.itemgetter(1)):
print(list(group))
cede
[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar')]
[('xx', 'B', 'foobar'), ('yy', 'B', 'foo')]
[(1000, 'C', 'py'), (200, 'C', 'foo')]
Oppure, per creare una lista con ogni gruppo come un elenco secondario, è possibile utilizzare una lista di comprensione:
[list(group) for key,group in itertools.groupby(data,operator.itemgetter(1))]
Il seco nd argomento a itertools.groupby
è una funzione che si applica a itertools.groupby
per ogni articolo in data
(il primo argomento). Si prevede di restituire un key
. itertools.groupby
quindi raggruppa tutti gli elementi contigui con lo stesso key
.
operator.itemgetter(1) preleva il secondo elemento in sequenza.
Per esempio, se
row=(1, 'A', 'foo')
poi
operator.itemgetter(1)(row)
uguale 'A'
.
Come @eryksun sottolinea nei commenti, se le categorie di tuple appaiono in un certo ordine casuale, quindi è necessario ordinare data
prima di applicare itertools.groupby
. Questo perché itertools.groupy
raccoglie solo articoli contigui con la stessa chiave in gruppi.
Per ordinare le tuple per categoria, utilizzare:
data2=sorted(data,key=operator.itemgetter(1))
possibile duplicato di [Ordinamento di sub-elenchi in nuovi sotto-elenchi?] (Http://stackoverflow.com/questions/71140 38/sorting-sub-lists-into-new-sub-lists) – agf