Python中list的切片细节

简介: Python中的切片功能强大。但是切片很容易让人搞混。个人觉得Python的文档不怎么好,好多东西都是零散的,更像教科书。

Python中的切片功能强大。但是切片很容易让人搞混。

个人觉得Python的文档不怎么好,好多东西都是零散的,更像教科书。

下面的参考来自Python3.2文档和Python参考手册(第4版):

a = [1,2,3,4] x = a[1:2] #a.__getitem__(slice(1,2,None)) slice([start], stop[, step]) Return a slice object representing the set of indices specified by range(start, stop, step). The start and step arguments default to None. Slice objects have read-only data attributes start, stop and step which merely return the argument values (or their default). They have no other explicit functionality; however they are used by Numerical Python and other third party extensions. Slice objects are also generated when extended indexing syntax is used. For example: a[start:stop:step] or a[start:stop, i]. See itertools.islice() for an alternate version that returns an iterator. range([start], stop[, step]) This is a versatile function to create iterables yielding arithmetic progressions. It is most often used in for loops. The arguments must be integers. If the step argument is omitted, it defaults to 1. If the start argument is omitted, it defaults to 0. The full form returns an iterable of integers [start, start + step, start + 2 * step, ...]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised).  

 

可以看到,list的切片,内部是调用__getitem__,和slice函数。而slice函数又是和range()函数相关的。

range([start], stop[, step])

[start, start + step, start + 2 * step, ...]

 

真正让人迷惑的是list[start:stop:step]中的start和stop的默认值。

按《Python参考手册(第4版)》的说法:

    如果不指定start和stop具体值

    当step>0时,start和stop默认值是索引的开头

    当step<0时,start和stop默认值是索引的结尾

我仔细再想下,发现有点不妥,a[::-1]又怎样解释?

我觉得step的符号表示一种方向的含义:

+:即从左向右看,所以start默认是0,stop默认是索引最大值

- :即从右向左看,所以start默认是索引最大值,stop默认是0

如:

 

a = [0,1,2,3,4,5,6,7,8,9] a[:5:-1] #step < 0,所以start = 9 a[0:5:-1] #指定了start = 0 a[1::-1] #step < 0,所以stop = 0 

Python3代码:

l = list(range(10)) print(l[5:0:-1]) print(l[5:4:-1]) print(l[:3:-1]) print(l[0:3:-1]) print(l[9::-1])

输出:

 

[5, 4, 3, 2, 1] [5] [9, 8, 7, 6, 5, 4] [] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

相关文章
|
3月前
|
索引 Python
Python错误 - 'list' object is not callable 的问题定位与解决
出现编程问题并不可怕,关键在于是否可以从中学习与成长。遇到'list' object is not callable这样的错误,我们不仅需要学会应对,更需要了解其背后的原因,避免类似的问题再次出现。记住,Python的强大功能和灵活性同时也意味着我们需要对其理解更准确,才能更好的使用它。
384 70
|
7月前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
121 9
|
7月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
164 14
|
7月前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
348 10
|
9月前
|
测试技术 开发者 Python
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
在 Python 中,创建列表有两种方法:使用方括号 `[]` 和调用 `list()` 函数。虽然两者都能创建空列表,但 `[]` 更简洁、高效。性能测试显示,`[]` 的创建速度比 `list()` 快约一倍。此外,`list()` 可以接受一个可迭代对象作为参数并将其转换为列表,而 `[]` 则需要逐一列举元素。综上,`[]` 适合创建空列表,`list()` 适合转换可迭代对象。
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
|
9月前
|
索引 Python
Python 高级编程:深入探索字符串切片
在Python中,字符串切片功能强大,可灵活提取特定部分。本文详细介绍切片技巧:基本切片、省略起始或结束索引、使用负数索引、设定步长及反转字符串等。此外,还介绍了如何结合其他操作进行切片处理,如先转换大小写再提取子串。 来源:https://www.wodianping.com/yeyou/2024-10/48238.html
122 4
|
11月前
|
数据处理 索引 Python
Python 中的切片
【8月更文挑战第29天】
124 4
|
9月前
|
索引 Python
Python列表操作-推导式(List Comprehension)
Python列表操作-推导式(List Comprehension)
103 0
|
10月前
|
Python
Python量化炒股的获取数据函数— get_billboard_list()
Python量化炒股的获取数据函数— get_billboard_list()
132 0
|
10月前
|
数据处理 Python
Python切片魔法:一行代码实现高效数据处理
Python切片魔法:一行代码实现高效数据处理
81 0

推荐镜像

更多