转置列表的列表

26 浏览
0 Comments

转置列表的列表

让我们来看看:

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

我要的结果是:

r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

而不是:

r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

admin 更改状态以发布 2023年5月24日
0
0 Comments

和Jena的解决方案等价:

>>> l=[[1,2,3],[4,5,6],[7,8,9]]
>>> [list(i) for i in zip(*l)]
... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

0
0 Comments

Python 3:

# short circuits at shortest nested list if table is jagged:
list(map(list, zip(*l)))
# discards no data if jagged and fills short nested lists with None
list(map(list, itertools.zip_longest(*l, fillvalue=None)))

Python 2:

map(list, zip(*l))


[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

说明:

我们需要知道两件事才能理解发生了什么:

  1. zip的签名:zip(*iterables),这意味着zip期望任意数量的参数,每个参数必须是可迭代的。例如:zip([1, 2], [3, 4], [5, 6])
  2. 解包参数列表:给定一个参数序列argsf(*args)会调用f,使得args中的每个元素都是f的单独的位置参数。
  3. itertools.zip_longest不会丢弃任何数据,如果嵌套列表的元素数量不同(同质),而是填充较短的嵌套列表然后将它们一起压缩。

回到问题中的输入l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]zip(*l)等同于zip([1, 2, 3], [4, 5, 6], [7, 8, 9])。其余部分只是确保结果是一个列表的列表,而不是元组的列表。

0