繁体   English   中英

清单清单的Python切片

[英]Python slicing of list of list

说我有一个清单清单

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

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

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

整个第二个列表为:

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

但是,以下为什么也给我第二个列表?

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

我认为这会给我三个列表中每个列表的第二项。

可以使用列表理解来实现这一点(如问题13380993所示 ),但是我很好奇如何正确理解s[:][1]

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

如果您想拥有第二个项目,请使用列表理解:

[n[1] for n in s]

演示:

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

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

s[:]

将返回整个列表:

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

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

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]

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

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

s[1][:]表示s第二个项目的浅表副本 ,即[3,4]

s[:][1]表示s的浅表副本中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开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM