python - 为什么 x[i][ :]=x[:][i] where x is a list of lists?

标签 python list

我正在处理一个列表列表,访问列一直很困惑。

假设 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]

这可能是您正在寻找的。

关于python - 为什么 x[i][ :]=x[:][i] where x is a list of lists?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687525/

相关文章:

list - 在 R 中,如何过滤列表列表?

arrays - 如何存储在多重图中使用的 ggplots 列表而不覆盖以前的图?

python - 如果大小增加,为什么 python 列表的位置没有改变?

List.empty vs. List() vs. new List()

Python Tkinter Table 通过拖放对表列进行排序

python - 如果其中一个是字符串,如何对两个十六进制值进行异或?

python - 在 pyspark 中处理大数字的数据类型

python - DEAP 中的健身分享

python - 从头开始实现决策树的分支时遇到困难(长)

list - 在模式中重用列表