【问题标题】:Python - slice a list of listPython - 切片列表列表
【发布时间】:2012-02-28 06:52:43
【问题描述】:

我认为它叫做切片......

基本上我有一个列表列表:

[['fmt/10', 3L, 5L, Decimal('9500')], 
['fmt/353', 1L, 1L, Decimal('500')], 
['fmt/7', 3L, 5L, Decimal('9500')], 
['fmt/8', 3L, 5L, Decimal('9500')], 
['fmt/9', 3L, 5L, Decimal('9500')]]

我想拉出 4 个新列表,都在位置 [0]、[1]、[2] 和 [3]。

所以如果看起来像:

A = ['fmt/10', 'fmt/353','fmt/7','fmt/8','fmt/9']
B = [3,1,3,3,3] 
C = [5,1,5,5,5]
D = [9500,500,9500,9500,9500]

实现这一目标的最简单方法是什么? 通过阅读,我想我想使用“zip”,但我不确定它是如何工作的。

【问题讨论】:

  • 顺便说一下,这叫做矩阵转置。

标签: python list slice


【解决方案1】:
L = [['fmt/10', 3L, 5L, Decimal('9500')], 
     ['fmt/353', 1L, 1L, Decimal('500')], 
     ['fmt/7', 3L, 5L, Decimal('9500')], 
     ['fmt/8', 3L, 5L, Decimal('9500')], 
     ['fmt/9', 3L, 5L, Decimal('9500')]]

zip(*L)(星号用于解压列表)将给出:

[('fmt/10', 'fmt/353', 'fmt/7', 'fmt/8', 'fmt/9'),
 (3L, 1L, 3L, 3L, 3L),
 (5L, 1L, 5L, 5L, 5L),
 (Decimal('9500'), Decimal('500'), Decimal('9500'), Decimal('9500'), Decimal('9500'))]

你可以使用解构赋值:

A, B, C, D = zip(*L)

【讨论】:

  • 真的就是这么简单。谢谢!当然,它按预期工作。
  • 是的,否则你将不得不做类似 [[l[i] for l in L] for i in range(4)]
【解决方案2】:
A, B, C, D = apply(zip, [['fmt/10', 3L, 5L, Decimal('9500')], 
                         ['fmt/353', 1L, 1L, Decimal('500')], 
                         ['fmt/7', 3L, 5L, Decimal('9500')], 
                         ['fmt/8', 3L, 5L, Decimal('9500')], 
                         ['fmt/9', 3L, 5L, Decimal('9500')]])

【讨论】:

  • 注意:python 文档声明 apply() 自 python2.3 以来已被弃用,应使用 * 解包。在 python3 中删除了 apply 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2015-02-19
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多