Python 语法 / 列表切片问题:这段语法是什么意思?

1 投票
3 回答
2616 浏览
提问于 2025-04-16 22:29
lines = file('info.csv','r').readlines()

counts = []
for i in xrange(4):
    counts.append(fromstring(lines[i][:-2],sep=',')[0:-1])

如果有人能给我解释一下这段代码,我会非常感激。我找不到更高级的切片示例,只有一些非常简单的例子,无法解释我遇到的情况。

非常感谢。

3 个回答

2

如果 list 是一个列表,那么 list[-1] 就是这个列表的最后一个元素,list[-2] 是倒数第二个元素,以此类推。

另外,list[a:b] 的意思是取出列表中从位置 a 到位置 b 之间的所有元素。如果其中一个位置没有给出,默认就是到列表的末尾。所以,list[2:] 就是从 list[2] 开始的所有元素。而 list[:-2] 则是从 list[0]list[-2] 的所有元素。

在你的代码中,[0:-1][:-1] 是一样的。

5

理解切片语法的一个好方法是把它看作是等同于一个for循环的简化写法。比如:

L[a:b:c]

这相当于(例如,在C语言中):

for(int i = a; i < b; i += c) {
    // slice contains L[i]
}

这里,a 默认是 0b 默认是 len(L),而 c 默认是 1

(如果 c,也就是步长,是一个负数,那么 ab 的默认值会反转。这就能让 L[::-1] 得到合理的结果。)

然后你需要知道的另一件事是,在Python中,索引是“循环”的,所以 L[-1] 表示列表中的最后一个项目,L[-2] 是倒数第二个,以此类推。

5

切片的格式是 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 的默认值。这和之前的切片是一样的,只不过它排除了最后一个元素。

在 Python 2.7 文档的数据模型页面中提到:

序列也支持切片:a[i:j] 选择所有索引 k 满足 i <= k < j 的项。当作为表达式使用时,切片是同类型的序列。这意味着索引会重新编号,从 0 开始。

一些序列还支持“扩展切片”,即带有第三个“步长”参数:a[i:j:k] 选择所有索引 x 满足 x = i + n*k, n >= 0i <= x < j 的项。

Python 2.3 文档的“新特性”部分也讨论了这些内容,讲述了它们是何时被加入到语言中的。

撰写回答