Использование itertools для группировки последовательных кортежей по второму значению

У меня есть набор данных в виде:

X1 = [(1,1),(3,1),(5,0),(3,0),(2,1)]

Я не могу понять, как их сгруппировать так, чтобы:

X2 = [[(1,1),(3,1)],[(5,0),(3,0)],[(2,1)]]

то есть они группируются последовательно по второму значению в каждом кортеже.

Я знаю, что это что-то с этим:

http://docs.python.org/2/library/itertools.html#itertools.groupby


person user3394391    schedule 16.03.2014    source источник
comment
зачем вам использовать itertools, когда есть более простые способы?   -  person Ol' Reliable    schedule 17.03.2014
comment
@Ol'Reliable: Потому что ваш более простой способ делает что-то другое. Что делать, если данные [(0, 1), (1, 1), (2, 1), (0, 0), (0, 2)]?   -  person user2357112 supports Monica    schedule 17.03.2014
comment
какой должен быть вывод?   -  person Ol' Reliable    schedule 17.03.2014
comment
ок ок, извините, я не совсем понял проблему   -  person Ol' Reliable    schedule 17.03.2014
comment
Не нужно извиняться, чувак! Группировка определяется вторым значением в каждом кортеже. например. для X1 без учета первых значений это (a,1),(b,1),(c,0),(d,0),(e,1) Последовательные одинаковые значения группируются: ((a,1 ),(b,1))((c,0),(d,0)),(e1)) Конечно, вторые значения могут быть любыми... но они всегда будут сгруппированы на основе равного значения и последовательного позиционирования .   -  person user3394391    schedule 17.03.2014


Ответы (2)


from itertools import groupby
from operator import itemgetter
X2 = [list(group) for key, group in groupby(X1, itemgetter(1))]

Передайте функцию key функции groupby, которая извлекает второй элемент каждого кортежа, поэтому groupby группирует кортежи по их вторым элементам.

person user2357112 supports Monica    schedule 16.03.2014
comment
... Нравится гибкость, поэтому я пойду с этим. Отлично сработано! - person user3394391; 17.03.2014

person    schedule
comment
Функционально и без модулей, плавно! - person user3394391; 17.03.2014