2014-07-10 96 views
7

我正在处理列表和访问列的列表一直很混乱。为什么x [i] [:] = x [:] [i]其中x是列表的列表?

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

有人能解释一下为什么? 谢谢

+2

你为什么使用列表清单?你有NumPy!你正在使用NumPy的随机数发生器!使用数组!如果你有一个数组而不是列表列表,'x [i,:]'和'x [:,i]'会做你想要的。 – user2357112

+0

因为我有不同大小和类型的列表,这里的示例仅用于说明。 – ipluto

回答

6

如果将每个表达式的两个索引操作分解为单独的部分,则该行为非常易于理解。

  • x[1]将是您的列表清单(列表[76, 80, 44, 30, 73])中的第二个值。
  • x[1][:]x[1](跨越整个列表的切片)的副本。
  • x[:]x(列表清单)的(浅)副本。
  • x[:][1]是列表复制列表中的第二个值,与x[1]相同。

因此,这两个表达式是相等的。请注意,由于第一个表达式复制列表(最后使用[:]切片),它们不是同一个对象(x[1][:] is 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] 

这可能是你所期待的。

+0

感谢您的详细解释。如果不是我在原始列表中列出的不同类型的列表,我肯定会使用np.array。 – ipluto

3

x[:][1]是整个阵列行1和x[1][:]都是x的第1行,所以他们都指向同一行。

In [2]: x[:] 
Out[2]: 
[[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]] 
In [3]: x[1] 
Out[3]: [76, 80, 44, 30, 73] 

In [4]: x[1][:] 
Out[4]: [76, 80, 44, 30, 73] 

使用x[:]经常使用,如果你想的x的副本保存在一个变量,只是一个参考吧:

In [6]: x1 = x[:] 

In [7]: x1 
Out[7]: 
[[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]] 

创建一个副本:

In [11]: x1 = x[:] 
In [12]: id(x1)  # different objects so different id's 
Out[12]: 140130415845104  
In [13]: id(x) 
Out[13]: 140130400510176 

创建参考:

In [14]: x1 = x 

In [15]: id(x) # same object so same id's 
Out[15]: 140130400510176 

In [16]: id(x1) 
Out[16]: 140130400510176 
1

x[1][:]首先得到x[1]这是列表中的第一个对象。在这种情况下,它是一个列表。然后,通过将[:]添加到该表中,您说要返回该第一个列表中的所有列表对象。所以它从列表的主要列表中返回整个第一个列表对象。

x[:][1]首先说的是x[:]返回整个列表。然后通过添加[1]您只是说要返回整个列表中的第一项。

相关问题