Python 语法 / 列表切片问题:这段语法是什么意思?
lines = file('info.csv','r').readlines()
counts = []
for i in xrange(4):
counts.append(fromstring(lines[i][:-2],sep=',')[0:-1])
如果有人能给我解释一下这段代码,我会非常感激。我找不到更高级的切片示例,只有一些非常简单的例子,无法解释我遇到的情况。
非常感谢。
3 个回答
如果 list
是一个列表,那么 list[-1]
就是这个列表的最后一个元素,list[-2]
是倒数第二个元素,以此类推。
另外,list[a:b]
的意思是取出列表中从位置 a
到位置 b
之间的所有元素。如果其中一个位置没有给出,默认就是到列表的末尾。所以,list[2:]
就是从 list[2]
开始的所有元素。而 list[:-2]
则是从 list[0]
到 list[-2]
的所有元素。
在你的代码中,[0:-1]
和 [:-1]
是一样的。
理解切片语法的一个好方法是把它看作是等同于一个for
循环的简化写法。比如:
L[a:b:c]
这相当于(例如,在C语言中):
for(int i = a; i < b; i += c) {
// slice contains L[i]
}
这里,a
默认是 0
,b
默认是 len(L)
,而 c
默认是 1
。
(如果 c
,也就是步长,是一个负数,那么 a
和 b
的默认值会反转。这就能让 L[::-1]
得到合理的结果。)
然后你需要知道的另一件事是,在Python中,索引是“循环”的,所以 L[-1]
表示列表中的最后一个项目,L[-2]
是倒数第二个,以此类推。
切片的格式是 o[start:stop:step]
,其中的部分都是可选的。start
默认是 0
,也就是列表的第一个位置。stop
默认是 len(o)
,表示列表的最后一个位置之后的一个位置。step
默认是 1
,这意味着会包含列表中的每一个值。
如果你输入一个负数,它表示从列表的末尾开始的偏移量。例如,[-1]
可以用来访问列表的最后一个元素,而 -2
则是倒数第二个元素。
如果你给 step
输入一个不是 1
的值,你会得到不同的元素,或者以不同的顺序包含它们。比如,2
会跳过每隔一个的元素,3
会跳过每三个中的两个,而 -1
则是从后往前遍历列表。
[:-2]
因为 start
被省略了,所以它默认是列表的开头。stop
是 -2
,表示要排除最后两个元素。所以 o[:-2]
就是切片,排除了最后两个元素。
[0:-1]
这里的 0
是多余的,因为它本来就是 start
的默认值。这和之前的切片是一样的,只不过它排除了最后一个元素。
序列也支持切片:
a[i:j]
选择所有索引k
满足i <= k < j
的项。当作为表达式使用时,切片是同类型的序列。这意味着索引会重新编号,从 0 开始。一些序列还支持“扩展切片”,即带有第三个“步长”参数:
a[i:j:k]
选择所有索引x
满足x = i + n*k, n >= 0
且i <= x < j
的项。
Python 2.3 文档的“新特性”部分也讨论了这些内容,讲述了它们是何时被加入到语言中的。