切片嵌套列表

时间:2011-03-18 01:25:34

标签: python numpy slice

我熟悉切片,我无法绕过这个,我尝试改变一些值来试图说明发生了什么,但是这对我没用。

无论如何,这是一个例子:

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"这对我没有意义。

3 个答案:

答案 0 :(得分:14)

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

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

有一个非常好的解释here。我记得当我第一次了解它时,它会澄清一切。

答案 1 :(得分:1)

仅当'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]]
>>> 

答案 2 :(得分:0)

以下内容适用于普通列表。假设它是一个列表列表, 并且所有子列表的长度都相同,那么您可以执行此操作(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]]