oro*_*ome 14 python list slice python-2.7
我理解给定一个可迭代的
>>> it = [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
例如,我可以把它变成一个列表并在任意点切掉两端
>>> it[1:-2]
[2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
或者反转它
>>> it[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)
或者将两者结合起来
>>> it[1:-2][::-1]
[7, 6, 5, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)
但是,尝试在单个操作中完成此操作会产生一些困扰我的结果:
>>> it[1:-2:-1]
[]
>>>> it[-1:2:-1]
[9, 8, 7, 6, 5, 4]
>>>> it[-2:1:-1]
[8, 7, 6, 5, 4, 3]
Run Code Online (Sandbox Code Playgroud)
经过多次试验和错误,我能得到我想要的东西:
>>> it[-3:0:-1]
[7, 6, 5, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)
这让我头疼(并且无法帮助我的代码的读者):
>>> it[-3:0:-1] == it[1:-2][::-1]
True
Run Code Online (Sandbox Code Playgroud)
我怎么能理解这个?我是否应该在思考这些事情?
FWYW,我的代码做了大量的截断,反转和迭代迭代,我正在寻找更快更清晰(是的,不要笑)的东西list(reversed(it[1:-2])).
这是因为在片中像 -
list[start:stop:step]
Run Code Online (Sandbox Code Playgroud)
start是包容性的,结果列表从索引开始start.
stop是独占的,即结果列表只包含元素stop - 1(而不是元素stop).
因此,对于你的情况it[1:-2]-该1是包容性的,这意味着切片结果开始于指数1,而-2是独家的,因此层号的最后一个元素会从指数-3.
因此,如果你想要反转它,你将不得不做it[-3:0:-1]- 只有那时-3才会包含在切片结果中,并且切片结果将上升到1索引.
你需要了解的重要事项是:
开始将包含在切片中
停止不会包含在切片中
如果要向后切片,则步长值应为负值.
基本上,您指定的范围是半开(半闭)范围.
当你说it[-3:0:-1]你实际上从后面的第三个元素开始,直到我们到达0(不包括零),一次向后一步元素.
>>> it[-3:0:-1]
[7, 6, 5, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)
相反,你可以像这样实现起始值
>>> it[len(it)-3 : 0 : -1]
[7, 6, 5, 4, 3, 2]
Run Code Online (Sandbox Code Playgroud)