如果我在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]
?
感谢阅读!
答案 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]
这将为您提供数据中所有列表中所有第二个元素的列表。