Python切片清单列表

时间:2013-11-30 22:43:32

标签: python list slice

说我有一份清单

    >>> s = [ [1,2], [3,4], [5,6] ]

我可以访问第二个列表中的项目:

    >>> s[1][0]
    3
    >>> s[1][1]
    4

整个第二个列表为:

    >>> s[1][:]
    [3, 4]

但为什么以下也给我第二个清单呢?

    >>> s[:][1]
    [3, 4]

我认为这会给我三个清单中的第二个项目。

可以使用列表理解来实现这一目标(如question 13380993中所述),但我很好奇如何正确理解s[:][1]

5 个答案:

答案 0 :(得分:4)

s[:]会返回列表的副本。下一个[...]适用于先前返回的表达式,[1]仍然是该列表的第二个元素。

如果您想拥有每一个项目,请使用列表推导:

[n[1] for n in s]

演示:

>>> s = [ [1,2], [3,4], [5,6] ]
>>> [n[1] for n in s]
[2, 4, 6]

答案 1 :(得分:3)

如果我们分解命令,可以很容易地理解行为:

s[:]

将返回整个列表:

[[1, 2], [3, 4], [5, 6]]

选择 [1] 现在给出第二个列表(python索引从零开始)。

答案 2 :(得分:2)

s[:][1]表示取一份s的浅表副本并给我第一个元素......虽然s[1][:]表示给我一个s[1]的浅表副本。

你可能会混淆你曾经看过利用numpy允许扩展切片的事情,例如:

>>> a = np.array([ [1,2], [3,4], [5,6] ])
>>> a[:,1]
array([2, 4, 6])

正如你所说,正常列表可以用list-comp完成:

second_elements = [el[1] for el in s]

答案 3 :(得分:2)

s[:]制作s的副本,因此以下[1]访问该副本的第二个元素。这与s[1]相同。

>>> s = [ [1,2], [3,4], [5,6] ]
>>> s[1]
[3, 4]
>>> s[:][1]
[3, 4]

答案 4 :(得分:2)

s[1][:]表示s中第二项的shallow copy,即[3,4]

s[:][1]表示s的浅表副本中的第二项,也是[3,4]

以下是演示:

>>> s = [ [1,2], [3,4], [5,6] ]
>>> # Shallow copy of `s`
>>> s[:]
[[1, 2], [3, 4], [5, 6]]
>>> # Second item in that copy
>>> s[:][1]
[3, 4]
>>> # Second item in `s`
>>> s[1]
[3, 4]
>>> # Shallow copy of that item
>>> s[1][:]
[3, 4]
>>>

此外,[1]会返回第二个项,而不是第一个,因为Python索引从0开始。