从python中的表列表中提取列

从python中的表列表中提取列,python,list,list-comprehension,nested-lists,Python,List,List Comprehension,Nested Lists,我有一个表格列表,其中每个表格都是一个列表列表。我想从每个表中提取列以获得列列表。举例说明: input=[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]] output=[[[1,4],[7,10],[13,16]],[[2,5],[8,11],[14,17]],[[3,6],[9,12],[15,18]]] 我知道我可能会使用几个for循环,但感觉应该有一个很好的单行程序来实现这一点 我打算将结果分配给变量: a

我有一个表格列表,其中每个表格都是一个列表列表。我想从每个表中提取列以获得列列表。举例说明:

input=[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]]
output=[[[1,4],[7,10],[13,16]],[[2,5],[8,11],[14,17]],[[3,6],[9,12],[15,18]]]
我知道我可能会使用几个for循环,但感觉应该有一个很好的单行程序来实现这一点

我打算将结果分配给变量:

a,b,_=output
通过一个表,我可以提取以下列:

>>>input=[[1,2,3],[4,5,6]]
>>>list(zip(*input))
[(1, 4), (2, 5), (3, 6)]
或转让:

>>>a,b,_=zip(*input)
>>>a
(1, 4)
>>>b
(2, 5)
但是对于一个表格列表,我还没能做到。以下是我尝试过但未成功的一些事情:

>>>list(zip(*zip(*input)))
[([1, 2, 3], [4, 5, 6]), ([7, 8, 9], [10, 11, 12]), ([13, 14, 15], [16, 17, 18])]
>>>[list(zip(*inp)) for inp in input]
[[(1, 4), (2, 5), (3, 6)], [(7, 10), (8, 11), (9, 12)], [(13, 16), (14, 17), (15, 18)]]
>>>[[x,y,z] for x,y,z in [zip(*inp) for inp in input]]
#same as above
>>> [[x,y] for inp in input for x,y in zip(*inp)]
[[1, 4], [2, 5], [3, 6], [7, 10], [8, 11], [9, 12], [13, 16], [14, 17], [15, 18]]
嵌套/解包分配也不适用于我:

>>>[[a,b,_]]=[zip(*inp) for inp in input]
ValueError: too many values to unpack (expected 1)
>>>[*a,*b,*_]=[[x,y] for x,y in [zip(*inp) for inp in input]]
SyntaxError: two starred expressions in assignment
有没有一个班轮来做我想做的事

编辑:请注意,虽然示例中有3个表,每个表有2行和3列,但我的实际用例中有未知数量的表和行

我在代码中使用了这一行:

list(zip(*[zip(*inp) for inp in input]))

你的最后一次尝试很接近。您还需要一个精心选择的嵌套级别。编辑:我添加了最后的
zip
步骤以获得所需的订单。我还使用了“星”符号来帮助展示如何扩展这个概念

given = [[[1,2,3],[4,5,6]],
         [[7,8,9],[10,11,12]],
         [[13,14,15],[16,17,18]]]

f1 = [[[a, b] for a, b in zip(list1, list2)] for list1, list2 in given]
print(f1)
f2 = list(zip(*f1))
print(f2)
输出(为可读性而编辑)


第二种是元组而不是中间层的列表;可以吗?如果没有,你能修好吗?(留给学生做练习…

有没有办法让这个方法适用于任何长度的列?它已经适用于第三维了。如果您想让它对前两个变量起作用,只需交易这对变量,替换为“星型”扩展,例如
*var
。这足以说明问题吗?*var是有意义的。但仔细看,它似乎与我所寻找的略有不同。将此应用到我的原始输入中,我得到:[[1,4],[2,5],[3,6],[[7,10],[8,11],[9,12],[13,16],[14,17],[15,18]](1)正如我所见,您发布的输出与所需的输出完全相同。(2) 如果你需要问另一个问题,请单独发布。注释不是解决编码困难的好地方。我不确定您在看什么,但我想要的输出是第二对为[7,10]的输出。
[[[1, 4], [2, 5], [3, 6]], 
 [[7, 10], [8, 11], [9, 12]], 
 [[13, 16], [14, 17], [15, 18]]]

[([1, 4], [7, 10], [13, 16]),
 ([2, 5], [8, 11], [14, 17]),
 ([3, 6], [9, 12], [15, 18])]