python 嵌套列表从行到列重新排序[重复]。


我的意见是

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]]

你也可以用一个更python的方法来解决这个问题。

list(zip(*tbl_port))

这将产生一个tuples的列表。

[(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 函数,将其转换为一个列表,或将其传递到一个列表理解中以产生所需的结果。

给TA打赏
共{{data.count}}人
人已打赏
未分类

显示多个图标的Eclipse启动图标

2022-9-8 15:35:40

未分类

SonarQube 8.2分析显示代码覆盖率为0。

2022-9-8 15:35:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索