【问题标题】:Python slicing of list of list列表列表的Python切片
【发布时间】:2013-11-30 22:43:31
【问题描述】:

假设我有一个列表列表

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

【问题讨论】:

  • 如果你想要这样的行为,请使用 numpy 数组,尽管语法略有不同:a = np.array(s); print a[:,1] --> [2 4 6]

标签: python list slice


【解决方案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]

【讨论】:

    【解决方案2】:

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

    s[:]
    

    将返回整个列表:

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

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

    【讨论】:

      【解决方案3】:

      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]
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          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 开始。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-14
            • 1970-01-01
            • 2017-06-24
            • 2015-02-19
            • 2014-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多