对可变长度嵌套元组列表进行分组

时间:2017-04-13 23:15:49

标签: python list tuples itertools

我正在尝试对复杂的嵌套元组进行分组,以便组合位于列表相同位置的元素。例如:

original_list = [(("input00", "input01",...), "target0"), 
                 (("input10", "input11",...), "target1"), ...]

应该成为:

grouped = [(["input00", "input10",...], 
            ["input01", "input11",...]), 
           ["target0", "target1",...]]

目的是将(在列表中)组合在同一位置的元素组合在一起。 type(grouped)本身可以是tuplelist(我认为无论如何都应该很容易将它从元组转换为列表)。例如,"input00"original_list[0][0][0]。我想将索引original_list[X][0][0]X = len(original_list))中的所有内容放入一个列表中(因此"input00""input10"等)。

我想对original_list[X][0][1]的元素执行相同的操作,更常见的是original_list[X][0][N],其中N = len(original_list[X][0])。我实现这个问题的部分原因是因为我很难用算法术语来思考这个问题。如果你看一下上面的第一个代码块,我直觉上只想将“同一列”中的所有内容组合在一起。

我已经尝试将其展平,然后做某种产品,但由于"target0""target1"所占据的位置也不在嵌套元组中,所以它有点复杂。另外,“输入”元组可以具有无限长度这一事实给我带来了一些麻烦。

我尝试过的东西(我尝试了一大堆其他的东西,甚至没有提供正确的解决方案,所以我会在这里省略它们):

In: list(itertools.chain(*original_list))
Out: [('input00', 'input01'), 'label0', ('input10', 'input11'), 'label1']

1 个答案:

答案 0 :(得分:0)

看起来你可能只想要一个转置:

grouped = ([i[0] for i in original_list], [i[1] for i in original_list])

(这与你的问题中关于什么是元组以及列表是什么的格式不完全相同,但调整它的方式很简单。此外,这个转置特定于输入的格式 - 特别是,它是特定于输入元组有2个元素的事实。)

人们倾向于将转置作为

grouped = zip(*original_list)
Python 3上的

list(zip(*original_list)),因为它简洁而又漂亮,您无需对输入结构进行任何硬编码。但是,如果original_list为空,zip无法推断出需要生成的结构,而grouped只会成为一个空列表,这可能会破坏事物。