【问题标题】:Slicing Nested List切片嵌套列表
【发布时间】:2011-07-17 20:29:32
【问题描述】:

我对切片很熟悉,对此我无法理解,我尝试更改一些值以尝试说明正在发生的事情,但这对我来说毫无意义。

不管怎样,下面是例子:

l = [[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 1]]  
print l[:,0:2]

导致:

[[0, 0], [0, 1] [1, 0], [1, 1]]

我试图将其翻译为“从索引 0 到 0,2 的切片,以 2 递增”,这对我来说毫无意义。

【问题讨论】:

  • 你是不是少了一些逗号?我在 Python 2.7 上使用该代码得到 SyntaxError。

标签: python numpy slice


【解决方案1】:

您所做的基本上是多轴切片。因为l 是一个二维列表,并且您希望对第二个维度进行切片,所以您使用逗号表示下一个维度。

, 0:2 选择第二个维度的前两个元素。

here 有一个非常好的解释。我记得当我第一次了解它时它很好地澄清了事情。

【讨论】:

    【解决方案2】:

    仅当 'l' 是一个 numpy 数组时,才如我所说的那样工作。 对于 'l' 作为常规列表,它会引发错误(Python 3.6):

    >>> l
    [[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
    >>> print (l[:,0:2])
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: list indices must be integers or slices, not tuple
    
    >>> l=np.array(l)
    >>> l
    array([[0, 0, 0],
           [0, 1, 0],
           [1, 0, 0],
           [1, 1, 1]])
    >>> print (l[:,0:2])
    [[0 0]
     [0 1]
     [1 0]
     [1 1]]
    >>> 
    

    【讨论】:

      【解决方案3】:

      以下内容应该适用于普通列表。假设它是一个列表列表, 并且所有子列表的长度相同,那么你可以这样做(python 2)

      A = [[1, 2], [3, 4], [5, 6]]
      print (f"A = {A}")
      
      flatA = sum(A, [])     # Flattens the 2D list
      print (f"flatA = {flatA}")
      len0 = len(A[0])
      lenall = len(flatA)
      B = [flatA[i:lenall:len0] for i in range(len0)] 
      print (f"B = {B}")
      

      输出将是:

      A = [[1, 2], [3, 4], [5, 6]]
      flatA = [1, 2, 3, 4, 5, 6]
      B = [[1, 3, 5], [2, 4, 6]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2021-11-11
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        相关资源
        最近更新 更多