2017-01-14 3 views
-1

Я пытаюсь группировать вложенные списки в python (я уже отсортировал данные). Конечный результат должен быть разделены запятой кортежей, по одному в строкеГруппировка вложенных списков в кортежи

Текущий вложенный список:

[['A123', '2012-01-01', 'estrogen'], 
['A123', '2012-01-01', 'ibuprofen '], 
['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

Желаемый результат (через запятую кортеж)

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen ')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 

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

+1

Нет такой вещи, как кортеж, разделенный запятой. Независимо от того, является ли это одной строкой или нет, зависит от того, как вы ее печатаете. Просьба уточнить, хотите ли вы построить список кортежей, кортеж кортежей или что-то еще. в частности, неясно, почему сгруппированы первые два и два последних кортежа. Они сгруппированы по дате? – DyZ

+0

цитата из вопроса OP: «Я уже отсортировал данные». Поэтому вам не нужно знать эту информацию. –

ответ

0

Поскольку вы уже отсортированы ваши данные, вы можете преобразовать списки кортежей и создать кортеж (пару) кортежи 2 на 2:

l = [['A123', '2012-01-01', 'estrogen'],['A123', '2012-01-01', 'ibuprofen'],['A123', '2014-01-01', 'oxaliplatin'], 
['A123', '2014-01-01', 'penicilin']] 

result = [(tuple(l[i]),tuple(l[i+1])) for i in range(0,len(l),2)] 
print(result) 

вариант с использованием zip и нарезанными подсписки:

result = [(tuple(u),tuple(v)) for u,v in zip(l[::2],l[1::2])] 

Вы не контролируете способ печати данных, если не используете модуль pprint.

import pprint 
pprint.pprint(result,width = 50) 

Поскольку я выбрал ширину 50, я получаю один элемент в каждой строке (это зависит от данных, но кажется, что он обеспечивает именно вывод, упомянутый в вашем вопросе, горизонтальное выравнивание в комплекте)

[(('A123', '2012-01-01', 'estrogen'), 
    ('A123', '2012-01-01', 'ibuprofen')), 
(('A123', '2014-01-01', 'oxaliplatin'), 
    ('A123', '2014-01-01', 'penicilin'))] 
+0

Спасибо, что сработало отлично! –

+0

хорошо, но вы хотите группировать 2 на 2 или по коду/дате? Потому что, если это последний, другой ответ один. –

+0

Вложенные списки уже отсортированы по коду и дате: list.sort (sampledata, key = itemgetter (0,1,2)) Вывод, необходимый для каждой пары, возвращаемой в виде разделенного запятыми кортежа, по одной в каждой строке. Если это имеет смысл. Ваш код работает и настраивается, если допустим, что он должен быть триплетами или одиночными. –

0

Это выглядит как случай для itertools.groupby:

>>> data = [['A123', '2012-01-01', 'estrogen'], 
... ['A123', '2012-01-01', 'ibuprofen '], 
... ['A123', '2014-01-01', 'oxaliplatin'], 
... ['A123', '2014-01-01', 'penicilin']] 
>>> [tuple(grp) for key, grp in itertools.groupby(data, key=lambda x: x[:2])] 
[(['A123', '2012-01-01', 'estrogen'], ['A123', '2012-01-01', 'ibuprofen ']), 
(['A123', '2014-01-01', 'oxaliplatin'], ['A123', '2014-01-01', 'penicilin'])] 

этой группы все элементы, которые имеют те же первые два элемента (key=lambda x: x[:2]) вместе в один кортеж. Обратите внимание, что данные должны быть отсортированы по ключу, чтобы это работало, но, по вашему мнению, это уже так.