python 从行到列重新排列嵌套列表
python reorder nested list from row to column
我的输入是
tbl_ports = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
我的预期输出是
[[1,5,9], [2,6,10], [3,7,11], [4,8,12]]
我的极限是执行以下操作来创建输出 reorder_list
reorder_list = []
for i in range(len(tbl_ports)):
for col in tbl_ports:
reorder_list.append(col[i])
reorder_list=[1, 5, 9, 2, 6, 10, 3, 7, 11]
如何将它们包含在包含 3 个元素的列表中?
要修复你已有的代码,你需要在每次完成一行时创建一个新列表,例如:
reorder_list = []
for i in range(len(tbl_ports)):
reorder_list.append([])
for col in tbl_ports:
reorder_list[-1].append(col[i])
这会产生以下结果:
[[1, 5, 9], [2, 6, 10], [3, 7, 11]]
你也可以用更pythonic的方法解题,
list(zip(*tbl_port))
这将产生一个元组列表:
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
如果你想要一个列表的列表,那么你可以简单地使用列表理解:
[list(e) for e in zip(*tbl_port)]
编辑:
要了解 zip(*list)
为何有效,您需要了解 zip 的作用。
zip 是 python 中的一个函数,它接受多个列表,并为每个相应列表中的每个元素输出一个列表生成器。所以 zip([1, 2, 3], [4, 5, 6])
会产生 [(1, 4), (2, 5), (3, 6)]
.
* 基本上将输入扩展为多个位置参数,其中 function(*[1, 2, 3, 4])
等同于 function(1, 2, 3, 4)
所以代码将输入数组作为参数列表传递给 zip 函数,然后按您想要的顺序输出结果。
唯一剩下的问题是 zip 生成生成器而不是实际列表。
要解决该问题,只需调用生成器上的 list
函数将其转换为列表,或将其传递到列表理解中以产生所需的结果。
这正是 zip() 函数的用途。
list(zip([1,2,3,4],'abcd'))
您可以使用解压语法“*”使 python 将您的列表解压到 zip 函数。
tbl_ports = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
reorder_list = list(zip(*tbl_ports))
我的输入是
tbl_ports = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
我的预期输出是
[[1,5,9], [2,6,10], [3,7,11], [4,8,12]]
我的极限是执行以下操作来创建输出 reorder_list
reorder_list = []
for i in range(len(tbl_ports)):
for col in tbl_ports:
reorder_list.append(col[i])
reorder_list=[1, 5, 9, 2, 6, 10, 3, 7, 11]
如何将它们包含在包含 3 个元素的列表中?
要修复你已有的代码,你需要在每次完成一行时创建一个新列表,例如:
reorder_list = []
for i in range(len(tbl_ports)):
reorder_list.append([])
for col in tbl_ports:
reorder_list[-1].append(col[i])
这会产生以下结果:
[[1, 5, 9], [2, 6, 10], [3, 7, 11]]
你也可以用更pythonic的方法解题,
list(zip(*tbl_port))
这将产生一个元组列表:
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
如果你想要一个列表的列表,那么你可以简单地使用列表理解:
[list(e) for e in zip(*tbl_port)]
编辑:
要了解 zip(*list)
为何有效,您需要了解 zip 的作用。
zip 是 python 中的一个函数,它接受多个列表,并为每个相应列表中的每个元素输出一个列表生成器。所以 zip([1, 2, 3], [4, 5, 6])
会产生 [(1, 4), (2, 5), (3, 6)]
.
* 基本上将输入扩展为多个位置参数,其中 function(*[1, 2, 3, 4])
等同于 function(1, 2, 3, 4)
所以代码将输入数组作为参数列表传递给 zip 函数,然后按您想要的顺序输出结果。
唯一剩下的问题是 zip 生成生成器而不是实际列表。
要解决该问题,只需调用生成器上的 list
函数将其转换为列表,或将其传递到列表理解中以产生所需的结果。
这正是 zip() 函数的用途。
list(zip([1,2,3,4],'abcd'))
您可以使用解压语法“*”使 python 将您的列表解压到 zip 函数。
tbl_ports = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
reorder_list = list(zip(*tbl_ports))