Python 将嵌套列表分组为元组

Python 将嵌套列表分组为元组,python,Python,我正在尝试用python对嵌套列表进行分组(我已经对数据进行了排序)。最终输出应该是逗号分隔的元组,每行一个 当前嵌套列表: [['A123', '2012-01-01', 'estrogen'], ['A123', '2012-01-01', 'ibuprofen '], ['A123', '2014-01-01', 'oxaliplatin'], ['A123', '2014-01-01', 'penicilin']] 期望结果(逗号分隔元组) 我了解排序,但不太知道如何将列表组合成

我正在尝试用python对嵌套列表进行分组(我已经对数据进行了排序)。最终输出应该是逗号分隔的元组,每行一个

当前嵌套列表:

[['A123', '2012-01-01', 'estrogen'],
 ['A123', '2012-01-01', 'ibuprofen '],
 ['A123', '2014-01-01', 'oxaliplatin'],
 ['A123', '2014-01-01', 'penicilin']]
期望结果(逗号分隔元组)


我了解排序,但不太知道如何将列表组合成一个。我假设的最后一步是转换为元组。

因为您已经对数据进行了排序,所以可以将列表转换为元组,并创建一个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的宽度,所以每行有一个元素(这取决于数据,但它似乎正好提供了您问题中提到的输出,包括水平对齐)


这看起来像是一个案例:


这将具有相同前两个元素(
key=lambda x:x[:2]
)的所有项组合在一个元组中。请注意,数据必须按键排序,才能正常工作,但根据您的说法,情况已经如此。

没有逗号分隔的元组。是否为每行一个,取决于打印方式。请澄清您是否要构建元组列表、元组元组列表或其他内容。特别是,不清楚为什么前两个元组和后两个元组被分组。它们是按日期分组的吗?引用OP问题:“我已经对数据进行了排序”。所以你不需要知道这些信息。好的,但是你想按2分组还是按代码/日期分组?因为如果是后者,那么另一个答案就是前者。嵌套列表已经按照代码和日期进行排序:list.sort(sampledata,key=itemgetter(0,1,2))。需要的输出是每对以逗号分隔的元组形式返回,每行一个。如果这有道理的话。你的代码可以工作,并且可以调整,如果我们说它需要是三胞胎或者单胎的话。我松了一口气。你没有提到你在每组都有固定数量的物品。如果不是这样的话,我的答案是无效的(至少是第一部分,你需要
itertools.groupby
。我已经按下按钮删除了它。。。
import pprint
pprint.pprint(result,width = 50)
[(('A123', '2012-01-01', 'estrogen'),
  ('A123', '2012-01-01', 'ibuprofen')),
 (('A123', '2014-01-01', 'oxaliplatin'),
  ('A123', '2014-01-01', 'penicilin'))]
>>> 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'])]