Python 从子列表的特定元素创建列表

Python 从子列表的特定元素创建列表,python,list,indexing,slice,sublist,Python,List,Indexing,Slice,Sublist,我的标题可能令人难以置信地困惑,所以我只举一个例子。有关以下列表: x = [ [1,2,3], [4,5,6], [7,8,9] ] 因此,如果您想从一个索引中得到一个结果列表: [2,5,8] 有没有捷径可走?显然,您可以遍历外部列表并简单地获取索引1的每个元素,但是有没有简单的方法可以在一行中使用slce表示法来实现这一点 我知道,可以通过以下方式在一行中完成此操作: list(map(lambda f : f[1], x)) 但这正是我上面描述的(仅使用隐式循环) 如果有帮助

我的标题可能令人难以置信地困惑,所以我只举一个例子。有关以下列表:

 x = [ [1,2,3], [4,5,6], [7,8,9] ]
因此,如果您想从一个索引中得到一个结果列表:

 [2,5,8]
有没有捷径可走?显然,您可以遍历外部列表并简单地获取索引1的每个元素,但是有没有简单的方法可以在一行中使用slce表示法来实现这一点

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

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

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


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

无论你做什么,总会有隐式循环

您还可以使用
zip
(look ma!no loops(对于
关键字没有
):

或列表理解:

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

无论你做什么,总会有隐含的循环

您还可以使用
zip
(look ma!no loops(对于
关键字没有
):

或列表理解:

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


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

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

“但这正是我上面所描述的(仅使用隐式循环)。”然而,由于问题没有通过此约束的答案,我将向上投票。@MihaiMaruseac:任何处理任意列表的代码都无法满足此要求。非常坦率地说,如果您在处理列表时的一个要求是“不应该有隐式循环”,那么您应该重新考虑这些要求。@MihaiMaruseac我添加了一个带有
zip
的版本,不知道它是否更快或什么。这不是我的要求,这是OP的:)我认为这不是一个真实的问题,并向前推进。建议
zip
不在序列上迭代(循环)是。。。错误。“但这正是我上面描述的(只是使用隐式循环)。”然而,由于问题没有通过此约束的答案,我将进行投票。@MihaiMaruseac:任何处理任意列表的代码都无法满足此要求。非常坦率地说,如果您在处理列表时的一个要求是“不应该有隐式循环”,那么您应该重新考虑这些要求。@MihaiMaruseac我添加了一个带有
zip
的版本,不知道它是否更快或什么。这不是我的要求,这是OP的:)我认为这不是一个真实的问题,并向前推进。建议
zip
不在序列上迭代(循环)是。。。错。你知道即使在片中也有一个隐式循环:)那么为什么你不想在没有(隐式或显式)循环的情况下这样做呢?这怎么可能呢?机器必须在某个点迭代序列才能做到这一点。我没说我想这么做。正如我所说,“有办法吗?”。我很好奇,所以我问。你知道即使在切片中也有一个隐式循环:)那么你为什么要在没有(隐式或显式)循环的情况下这样做呢?这怎么可能呢?机器必须在某个点迭代序列才能做到这一点。我没说我想这么做。正如我所说,“有办法吗?”。我很好奇,所以我问。我觉得我的
zip
版本更聪明!:(对你有好处!)但是zip版本有两个问题:如果内部列表很长,它会做更多的工作,需要更多的内存;如果列表为空,它会引发索引器:
zip(*[])[1]
。你刚刚偷走了我的雷霆,你这个大吝啬鬼!:P无论哪种方式+1.我认为我的
zip
版本更聪明(对你有好处!)但是zip版本有两个问题:如果内部列表很长,它会做更多的工作,需要更多的内存;如果列表为空,它会引发索引器:
zip(*[])[1]
。你刚刚偷走了我的雷霆,你这个大吝啬鬼!:P任意一个方向+1。
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]