【问题标题】:python reorder nested list from row to column [duplicate]python从行到列重新排序嵌套列表[重复]
【发布时间】:2020-08-07 14:48:41
【问题描述】:

我的输入是

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 个元素的列表中?

【问题讨论】:

  • [list(e) for e in zip(*[[1,2,3,4], [5,6,7,8], [9,10,11,12]])]

标签: python list nested-loops


【解决方案1】:

要修复你已有的代码,你需要在每行完成时创建一个新列表,例如:

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、*. zip是我第一次介绍,看起来很有用。
【解决方案2】:

这正是 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2020-12-17
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2018-03-06
    相关资源
    最近更新 更多