将嵌套列表分组为元组

时间:2017-01-14 22:14:10

标签: python

我试图在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'))]

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

2 个答案:

答案 0 :(得分: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'))]

答案 1 :(得分: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])的项目组合在一个元组中。请注意,数据必须按键进行排序才能生效,但根据您的情况已经是这样了。