2014-12-17 3 views
0

Я пытаюсь сгруппировать данные по второму аргументу.группировка списка кортежей с itertools

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

Я excuting код из этого thread

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

Но вместо того, чтобы получить результат, который выглядит следующим образом: [[(1,1), (3,1), (2,1)], [(5,0), (3,0)]]

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

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

+3

Потому что 'groupby' группирует только смежные элементы. Он не эквивалентен группе SQL. –

+0

Связано: [Как сгруппировать список кортежей/объектов с помощью аналогичного индекса/атрибута в python?] (Http://stackoverflow.com/questions/6602172/how-to-group-a-list-of-tuples-objects -by-like-index-attribute-in-python) –

ответ

1

Это споткнулся меня в прошлом. Если вы хотите, чтобы он группировался по всему миру, лучше сначала отсортировать его:

In [163]: test = [(1,1),(3,1),(5,0),(3,0),(2,1)] 

In [164]: crit = operator.itemgetter(1) 

In [165]: test.sort(key=crit) 

In [166]: result = [list(group) for key, group in itertools.groupby(test, crit)] 

In [167]: result 
Out[167]: [[(5, 0), (3, 0)], [(1, 1), (3, 1), (2, 1)]] 
+0

Спасибо! Это правильный ответ (мне нужно подождать немного времени, чтобы его можно было проверить (SO msg)) – user3378649

Смежные вопросы