转置列表的列表
转置列表的列表
让我们来看看:
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日
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]]
说明:
我们需要知道两件事才能理解发生了什么:
- zip的签名:
zip(*iterables)
,这意味着zip
期望任意数量的参数,每个参数必须是可迭代的。例如:zip([1, 2], [3, 4], [5, 6])
。 - 解包参数列表:给定一个参数序列
args
,f(*args)
会调用f
,使得args
中的每个元素都是f
的单独的位置参数。 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])
。其余部分只是确保结果是一个列表的列表,而不是元组的列表。