2017-04-13 61 views
-2

我试图分组复杂的嵌套元组,以便组合在列表中相同位置的元素。例如:分组的可变长度嵌套元组列表

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'] 
+0

向谁投降:你能解释一下我怎样才能更好地解决这个问题吗? –

+0

你能否试着更好地解释你的列表格式?什么是“元组索引”? – lolopop

+0

显示您尝试的代码和这些尝试的输出。 – Prune

回答

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只能成为空列表,这很可能会破坏事情。

+0

是的,这正是我想要的;这是非常有用的,非常感谢。 –