python - Python 的切片边界和 "stride"之间的神秘交互

标签 python list python-2.7 slice

我理解给定一个可迭代对象,例如

>>> it = [1, 2, 3, 4, 5, 6, 7, 8, 9]

我可以把它变成一个列表,然后在任意点切掉末端,例如

>>> it[1:-2]
[2, 3, 4, 5, 6, 7]

或反转

>>> it[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

或将两者结合

>>> it[1:-2][::-1]
[7, 6, 5, 4, 3, 2]

但是,尝试在单个操作中完成此操作会产生一些令我困惑的结果:

>>> it[1:-2:-1] 
[]
>>>> it[-1:2:-1] 
[9, 8, 7, 6, 5, 4]
>>>> it[-2:1:-1]
[8, 7, 6, 5, 4, 3]

只有经过反复试验,我才能得到我要找的东西:

>>> it[-3:0:-1]
[7, 6, 5, 4, 3, 2]

这让我很头疼(并且无法帮助阅读我的代码的读者):

>>> it[-3:0:-1] == it[1:-2][::-1]
True

我怎样才能理解这一点?我什至应该考虑这些事情吗?


FWYW,我的代码做了很多可迭代对象的截断、反转和列表化,我一直在寻找比 list(reversed(it[1 :-2]))

最佳答案

这是因为在像这样的切片中 -

list[start:stop:step]

start包含,结果列表从索引 start 开始。

stop排他性,即结果列表只包含 stop - 1 之前的元素(而不是stop 处的元素)。

因此对于您的情况it[1:-2] - 1包含 ,这意味着切片结果从索引 1 ,而 -2exclusive ,因此切片索引的最后一个元素将来自索引 -3 .

因此,如果您想要相反的情况,您必须执行 it[-3:0:-1] - 只有这样 -3 才会被包含在切片结果中,切片结果将上升到 1 索引。

关于python - Python 的切片边界和 "stride"之间的神秘交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33352169/

相关文章:

python - 如何在Python(而不是R)中使用igraph读取加权边缘列表?

python - 在 Pandas 数据框中的不同列上使用 lambda if 条件

python - 我可以使用 ktrain 库从检查点恢复训练吗?

Python 函数有 2 个列表,但只更改了 1 个

python - 匹配两个包含字符串的列表

python-2.7 - 如何在elasticsearch-py中按地理位置过滤?

python - 如何在失败时自动重启 python 脚本?

java - 从列表中删除元素

python - 限速 Python 中的无限 While 循环

regex - 匹配Python中含有转义字符的两个字符串(E :()