Используйте 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))
выходов
[(1, 'A', 'foo'), (2, 'A', 'bar'), (100, 'A', 'foo-bar')]
[('xx', 'B', 'foobar'), ('yy', 'B', 'foo')]
[(1000, 'C', 'py'), (200, 'C', 'foo')]
Или, чтобы создать один список с каждой группой в качестве подсписка, вы можете использоватьпонимание списка:
[list(group) for key,group in itertools.groupby(data,operator.itemgetter(1))]
Второй аргумент itertools.groupby
- это функция, которая itertools.groupby
применяется к каждому элементу в data
(первый аргумент).Ожидается, что он вернет key
.itertools.groupby
затем группирует все смежные элементы с одинаковыми key
.
operator.itemgetter (1) отбирает второй элемент в последовательности.
ДляНапример, если
row=(1, 'A', 'foo')
, то
operator.itemgetter(1)(row)
равно 'A'
.
Как указывает @eryksun в комментариях, если категориикортежи появляются в некотором случайном порядке, затем вы должны сначала отсортировать data
перед применением itertools.groupby
.Это связано с тем, что itertools.groupy
собирает только смежных элементов с одинаковым ключом в группы.
Для сортировки кортежей по категориям используйте:
data2=sorted(data,key=operator.itemgetter(1))