为什么pythons切片索引会给出反直觉的结果?

时间:2016-08-04 14:12:31

标签: python list indexing

如果我在python Data中有一个2D列表,我想创建一个2D列表的切片,我从中选择第一个索引中的所有元素,从第二个索引中选择一个。

例如

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

我想要清单;

raw_data = [b,e,i]

为什么要这样做;

raw_data = Data[:][1]

不能提供所需的输出? 我已经指定了第一个索引和第二个索引。 相反,我得到了输出;

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]

感谢阅读!

3 个答案:

答案 0 :(得分: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],即{{1} }}

如果你以另一种方式这样做:

[d,e,f]

您获得数据中的第二个元素>>> Data[1] ['d', 'e', 'f'] >>> Data[1][:] ['d', 'e', 'f'] ,然后使用与之前相同的列表切片语法再次获取相同的列表。

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

[d,e,f]

这很简单。

答案 1 :(得分:1)

Vanilla Python没有二维数组,但它确实允许扩展来实现它们。你有一个列表列表,这有点不同。

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

为什么您的示例没有按预期工作:data[:]表示" data"的副本因此data[:][1]表示data副本的索引1元素,即[d,e,f]

答案 2 :(得分:0)

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

raw_data = Data[:]

将为您提供整个数据,因此整个列表列表:[[a,b,c],[d,e,f],[h,i,g]]

raw_data = Data[:][1]
然后

将为您提供此列表中索引1处的元素,即[d,e,f]

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

[:]此对象将再次完整返回。

您要做的最好是使用列表理解,例如:

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

这将为您提供数据中所有列表中所有第二个元素的列表。