社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python切片的奇怪行为

user3105173 • 5 年前 • 1369 次点击  

假设我们有这个清单:

>>> a = [x for x in range(10)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

另外,两种方法都可以按预期分割工作:

>>> a[3:8]
[3, 4, 5, 6, 7]

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

但是,如果结合起来:

>>> a[3:8:-1]
[]

我希望是 [7, 6, 5 ,4, 3] 或者也许 [6, 5, 4, 3, 2] (如果先倒车)。 考虑一下当 start stop 未传递参数:

>>> a[:5:-1]
[9, 8, 7, 6]

这几乎是我所期望的,只差一项。测试了这个 numpy 它的行为似乎也一样。

这是怎么回事?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50763
 
1369 次点击  
文章 [ 3 ]  |  最新文章 5 年前
sammy
Reply   •   1 楼
sammy    5 年前

这种行为在 documentation

从i到j的s切片定义为索引为k的项序列,这样i<=k<j。如果i或j大于len(s),则使用len(s)。如果省略或没有,请使用0。如果j被省略或没有,使用len(s)。如果i大于或等于j,则切片为空。

从i到j的s切片,步骤k。。。。到达j时停止(但不包括j)。当k为正时,如果i和j的值较大,则它们将减为len(s)。当k为负时,如果i和j的值较大,则它们将被减为len(s)-1。如果i或j被省略或没有,它们将成为结束值(哪个结束取决于k的符号)。

Jean-François Fabre
Reply   •   2 楼
Jean-François Fabre    5 年前

a[3:8:-1] 指示python从3开始,按-1的步骤转到8

这将创建一个空列表:通过添加 -1 (就像 list(range(3,8,-1)) 这也给出了一个空列表)

当你这样做的时候 a[:5:-1] 然后start是默认的start,python将其设置为“end of list”,这样它就“工作了”

和你一样 a[::-1] start&stop是默认的,python知道它们是从头到尾的(否则这个符号将不可用)

Carcigenicate
Reply   •   3 楼
Carcigenicate    5 年前

a[3:8:-1]

切片的开始和停止位置不会根据步骤进行调整。如果步骤为负,则从3开始倒转,但是没有索引在3到8之间的元素从3开始倒数,因此得到一个空列表。

您需要相应地设置开始和停止:

a[8:3:-1]

从8到4。