【问题标题】:Create list out of a particular element of sublists从子列表的特定元素创建列表
【发布时间】:2013-12-16 14:39:11
【问题描述】:

我的标题可能令人难以置信的混乱,所以我只举一个例子。对于以下列表:

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

因此,如果您希望索引为 1,则结果列表将是:

 [2,5,8]

有没有捷径可以做到这一点?显然,您可以遍历外部列表并简单地获取索引 1 的每个元素,但是有没有简单的方法可以在一行中执行此操作,例如 slce 表示法?

我知道可以通过以下方式在一行中执行此操作:

 list(map(lambda f : f[1], x))

但这正是我上面描述的(只是使用隐式循环)。

如果有帮助,可以假设所有元素都是可索引的。

【问题讨论】:

  • 你知道即使在切片中也有一个隐式循环:)
  • 那么为什么您想在没有(隐式或显式)循环的情况下执行此操作?那怎么可能呢?机器必须在某一点或另一点迭代序列才能做到这一点。
  • 我没有说我想这样做。就像我说的那样——“有办法吗”。我很好奇,所以我问了。

标签: python list indexing slice sublist


【解决方案1】:

无论你做什么,总会有在某处隐式循环。

你也可以使用zip(看起来!没有循环(没有for关键字)):

>>> zip(*x)[0]
(1, 4, 7)
>>> zip(*x)[1]
(2, 5, 8)
>>> zip(*x)[2]
(3, 6, 9)

或列表推导:

>>> x = [ [1,2,3], [4,5,6], [7,8,9] ]
>>> l = [var[1] for var in x]
>>> l
[2, 5, 8]

如果你想要其他索引:

>>> [var[0] for var in x]
[1, 4, 7]
>>> [var[2] for var in x]
[3, 6, 9]

【讨论】:

  • “但这正是我上面描述的(只是使用隐式循环)。”但是,由于该问题没有通过此限制的答案,因此我会投票。
  • @MihaiMaruseac:没有任何代码可以与任意列表一起工作,能够满足这样的要求。坦率地说,如果您在使用列表时的要求之一是“不应该有隐式循环”,那么您应该再次考虑这些要求。
  • @MihaiMaruseac 我添加了一个带有zip 的版本,不知道它是否更快。
  • 这不是我的要求,这是 OP 的 :) 我认为这个问题不是一个真实的问题并继续前进。
  • 建议 zip 不对序列进行迭代(循环)是……错误的。
【解决方案2】:

要像这样直接索引您的数组,您可能希望使用 numpy.array。然后你可以使用切片表示法。

【讨论】:

    【解决方案3】:
    In [3]: x = [ [1,2,3], [4,5,6], [7,8,9] ]
    
    In [4]: import operator
    
    In [5]: map(operator.itemgetter(1), x)
    Out[5]: [2, 5, 8]
    

    【讨论】:

    • 我觉得我的zip 版本更聪明! :D
    • 对你有好处! :) 但是 zip 版本有两个问题:如果内部列表很长,它需要更多的内存,并且如果列表为空,则会引发 IndexError:zip(*[])[1]
    • 你刚刚抢了我的风头,你这个大坏蛋! :P 无论哪种方式 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多