我正在处理一个列表列表,访问列一直很困惑。
假设 x 定义如下:
x = [[int(np.random.rand()*100) for i in xrange(5)] for x in xrange(10)]
pprint.pprint(x)
[[86, 92, 95, 78, 68], [76, 80, 44, 30, 73], [48, 85, 99, 35, 14], [3, 84, 50, 39, 47], [3, 7, 67, 28, 65], [19, 13, 98, 53, 33], [9, 97, 35, 25, 89], [48, 3, 48, 5, 1], [21, 40, 72, 61, 62], [58, 43, 84, 69, 26]]
现在,x[1][:]
和 x[:][1]
都会产生相同的结果:
[76, 80, 44, 30, 73]
谁能解释一下为什么? 谢谢
最佳答案
如果您将每个表达式的两个索引操作分解为单独的部分,则行为非常容易理解。
x[1]
将是列表列表中的第二个值(列表[76, 80, 44, 30, 73]
)。x[1][:]
是x[1]
的副本(一个跨越整个列表的切片)。x[:]
是x
(列表的列表)的(浅)副本。x[:][1]
是复制的列表列表中的第二个值,它与x[1]
是同一个对象。
所以,这两个表达式是相等的。请注意,因为第一个表达式复制列表(末尾有 [:]
切片),所以它们不是同一个对象(x[1][:] 是 x[ :][1]
将为 False
)。
如果您使用的是 2D numpy 数组,您会得到不同的行为,因为您可以在任意维度上进行切片(使用稍微不同的语法):
import numpy as np
x = np.array([[86, 92, 95, 78, 68],
[76, 80, 44, 30, 73],
[48, 85, 99, 35, 14],
[3, 84, 50, 39, 47],
[3, 7, 67, 28, 65],
[19, 13, 98, 53, 33],
[9, 97, 35, 25, 89],
[48, 3, 48, 5, 1],
[21, 40, 72, 61, 62],
[58, 43, 84, 69, 26]])
print(x[1,:]) # prints the values of the second row: [76 80 44 30 73]
print(x[:,1]) # prints the values of the second column: [92 80 85 84 7 13 97 3 40 43]
这可能是您正在寻找的。p>
关于python - 为什么 x[i][ :]=x[:][i] where x is a list of lists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687525/