我试图在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'))]
我理解排序但不太清楚如何将列表组合成一个。我假设的最后一步是转换为元组。
答案 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]
)的项目组合在一个元组中。请注意,数据必须按键进行排序才能生效,但根据您的情况已经是这样了。