转置列表列表

新手上路,请多包涵

让我们来:

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

原文由 titus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
2 个回答

蟒蛇 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)))

蟒蛇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. Unpacked argument lists : Given a sequence of arguments args , f(*args) will call f such that each element in args is a separate positional argument 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]) 。剩下的只是确保结果是列表列表而不是元组列表。

原文由 jena 发布,翻译遵循 CC BY-SA 4.0 许可协议

相当于耶拿的解决方案:

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

原文由 inspectorG4dget 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题