2016-08-04 54 views
0

如果我在python Data中有一个2D列表,并且我想创建一个2D列表的一部分,我从第一个索引中选择所有元素,从第二个索引中选择一个。为什么pythons切片索引提供反直觉结果?

例如。

Data = [[a,b,c],[d,e,f],[h,i,g]] 

我想要清单;

raw_data = [b,e,i] 

为什么要做类似的事情;

​​

没有给出所需的输出? 我已经为第二个指定了整个第一个索引和第一个索引。相反,我得到的输出是;

raw_data = [d,e,f] 

这是我期望得到的;

raw_data = Data[1][:] 

raw_data = [d,e,f] 

所以;

Data[1][:] = Data[:][1] 

这与我的心智模式如何在python中的工作方式不兼容。我不得不使用循环来做到这一点;

raw_data = [] 

for i in xrange(0,len(Data),1): 
     raw_data.append(Data[i][1]) 

所以我的问题是,任何人都可以解释为什么Data[1][:] = Data[:][1]

感谢您的阅读!

+0

采取的指数1元完整的列表将生成一个副本,所以你正在制作一个完全相同的副本,然后从中获取项目'1',或获取项目'1',然后复制结果。 –

+0

我假设你来自一个具有多维列表的编程语言,如果你这样做,可以尝试'numpy',因为它可以让你做'Data [:, 1]'来获得你想要的结果。 –

+0

'list [:]'只是list的一个副本。这意味着'data [:] == data'(ish)和'data [1] == data [1] [:]'。所以当然''data [1] [:] == data [:] [1]' –

回答

2

lst[:]没有明确的开始没有明确的结束,所以根据Python文档,它将返回列表的一个副本,从列表的开始和结束开始。换句话说,它会返回您之前拥有的相同列表的副本。所以:

>>> Data = [['a','b','c'],['d','e','f'],['h','i','g']] 
>>> Data[:] 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['h', 'i', 'g']] 

所以,当你说Data[:],将评估对相同的Data副本,这意味着Data[:][1]本质上只是Data[1],这是[d,e,f]

如果你做它的其他方式:

>>> Data[1] 
['d', 'e', 'f'] 
>>> Data[1][:] 
['d', 'e', 'f'] 

你得到的数据,[d,e,f]第二个元素,那么你用的是相同的列表切片语法之前再次得到相同的列表。

为了得到你想要的东西,我会使用列表理解:

>>> [x[1] for x in Data] 
['b', 'e', 'i'] 

这么简单。

+0

你从字面上打我20秒:D –

+0

你没有提到'l [:]'_创建list_的副本,不返回相同的列表!尽管这种情况并不重要,但它很容易传播关于切片的误解。 –

+0

你是对的,我应该已经更加明确 - 现在可能无所谓,但我编辑它更清晰 – James

0

这很明显,如果你经历从左到右发生的事情。

raw_data = Data[:] 

会给你全部数据,因此列表的整个列表:然后[[a,b,c],[d,e,f],[h,i,g]]

​​

会给你的元素索引1在这份名单中,这是[d,e,f]

另一方面, raw_data = Data [1] 将返回数据中位置1的元素,也是[d,e,f]

[:]此对象将再次返回其本身。

你所试图做的是最好用列表解析完成,如:

raw_data = [x[1] for x in Data] 

这将使你在所有的数据列出了所有第二个元素的列表。

1

Vanilla Python没有二维数组,但它确实允许扩展来实现它们。你有一份清单,有些不同。

您的问题的解决方案是使用numpy它具有2d数组类型。那么你可以说data[:,1]

为什么你希望你的例子不工作:data[:]手段“的data副本”等data[:][1]意味着data的副本,这是[d,e,f]

+0

二维numpy数组实际上只是一个数组的数组,根本没有太大的差别。对于他的用例numpy真的不会添加任何东西。 – James

+0

@James列表和numpy数组的实现方式大不相同,访问数组的列显然比多维列表更容易'Data [:,1]'。 –

+0

@詹姆斯我倾向于不同意,一个numpy数组是一个多维结构。从概念上讲,它与列表清单不同。如果你实际上有一个2d数组,并且它包含一致类型的数据,那么'data [:,1]'更短,更容易阅读并且比理解更快。如果你实际上有一个列表清单(例如可变长度行,不一致类型),那么理解更自然。 –

相关问题