Python列表进阶:range生成与排序实战指南
本文深入解析Python中list的核心操作,重点讲解range函数生成数字序列的完整逻辑与参数细节,涵盖start、stop及step的正负步长处理。同时对比list.sort()与sorted()两种排序方法的异同,并通过大量交互式代码示例演示常见陷阱与正确用法,帮助开发者高效掌握列表生成与排序技巧。
关于列表(list)的讨论内容十分丰富,且在实际编程场景中应用极为广泛。
读者可能会疑惑:除了手动逐个列出元素外,是否还有让计算机依据特定规律自动生成列表的方法?
能提出这个问题,说明你具备“偷懒”的智慧,而这并非缺点。正是这种追求效率的“懒人”思维推动了技术进步,实际上他们并不懒惰。
接下来探讨对列表的具体操作方法。
利用range(start, stop)函数生成数字列表。
range(start, stop[, step])是Python的一个内置函数。
要深入理解包括内置函数在内的各类函数功能,建议读者首先明确函数名称的含义。Python中的命名并非随意,而是蕴含特定意义。关于命名规范,可参考本系列文章《永远强大的函数》中《取名字的学问》部分。
range n. 范围;幅度;排;山脉 vi. (在...内)变动;平行,列为一行;延伸;漫游;射程达到 vt. 漫游;放牧;使并列;归类于;来回走动 在动手实验前,按照惯例引用一段官方文档原文,以便深入理解:
This is a versatile function to create lists containing arithmetic progressions. It is most often used in for loops. The arguments must be plain 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 a list of plain 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).
从上述描述中,我们可以总结出关于range()函数的几个关键点:
该函数用于创建一个由数字元素组成的列表。 它最常与for循环配合使用(for循环将在后续章节介绍)。 函数的参数必须为整数,默认起始值为0。返回值形式类似于[start, start + step, start + 2*step, ...]。 step参数的默认值为1,若未指定则按此值处理。 当step为正数时,返回列表的最后一个值不包含stop,即start + i*step < stop;当step为负数时,start + i*step > stop。 step不能为零,否则将引发错误。
在实验开始前,再解释一下range(start, stop[, step])各参数的含义: start:起始数值,默认为0,若不写该项则视为start=0。 stop:结束数值,此项必须提供。 step:变化步长,默认为1,若不写则视为步长为1。步长绝对禁止为0。 现在开始实验,请对照前面的讲解进行验证:
>>> range(9) #stop=9,别的都没有写,含义就是range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8] #从0开始,步长为1,增加,直到小于9的那个数
>>> range(0,9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1,9) #start=1 [1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,2) #step=2,每个元素等于start+i*step, [0, 2, 4, 6, 8]
这里仅对range(0,9,2)进行解释。
若从0开始且步长为1,可简写为range(9)的形式;但如果步长为2,写成range(9,2)会让计算机困惑,因为它会误认为start=9, stop=2。因此,当步长不为1时,务必显式写出start的值。 以start=0, step=2, stop=9为例,列表第一个值为start=0,第二个值为start+1*step=2(注意这里是1而非2,前文已强调,无论是list还是str,元素编号均从0开始),第n个值为start+(n-1)*step。直至小于stop前的那个值。 熟悉上述计算逻辑后,观察以下输入的结果:
>>> range(-9) 我原本期望返回[0,-1,-2,-3,-4,-5,-6,-7,-8],这个期望能实现吗?
分析可知,此处start=0, step=1, stop=-9。
第一个值是0;第二个值按公式start+1*step计算应为1,但最后一个值限制为-9,显然逻辑不通。然而Python在此处并不报错,而是返回:
>>> range(-9)
[]
>>> range(0,-9)
[]
>>> range(0)
[]
报错与返回结果是两个概念,尽管返回结果并非我们所需。该如何修正呢?
>>> range(0,-9,-1)
[0, -1, -2, -3, -4, -5, -6, -7, -8]
>>> range(0,-9,-2)
[0, -2, -4, -6, -8]
有了这个内置函数,许多事情便简化了。例如:
>>> range(0,100,2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
生成100以内自然数中的偶数列表,现在可以非常简单地完成。
思考一个问题:假设有一个列表,如["I","am","a","pythoner","I","am","learning","it","with","qiwsir"],若要获取该列表所有序号组成的列表,但不能逐个用手指计数。该如何操作?
请沉思两分钟后自行实验,再查看下文。
>>> pythoner
['I', 'am', 'a', 'pythoner', 'I', 'am', 'learning', 'it', 'with', 'qiwsir']
>>> py_index = range(len(pythoner)) #以len(pythoner)为stop的值
>>> py_index
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
再逐个指着pythoner列表中的元素数一数,结果是否与输出一致。
排序:排排坐,分果果。
排序在现实生活和网络应用中无处不在。将梁山好汉从第1名排到第108名,这是一项颇具挑战的任务。
前文提到的内置函数range()生成的结果本身就是有序的。对于未排序的列表,如何进行排序?
有两种方法可实现列表排序:
list.sort(cmp=None, key=None, reverse=False) sorted(iterable[, cmp[, key[, reverse]]]) 通过以下实验,可以理解排序方法的具体用法。
>>> number = [1,4,6,2,9,7,3]
>>> number.sort()
>>> number
[1, 2, 3, 4, 6, 7, 9]
>>> number = [1,4,6,2,9,7,3] >>> number [1, 4, 6, 2, 9, 7, 3] >>> sorted(number) [1, 2, 3, 4, 6, 7, 9]
>>> number = [1,4,6,2,9,7,3] >>> number [1, 4, 6, 2, 9, 7, 3] >>> number.sort(reverse=True) #开始实现倒序 >>> number [9, 7, 6, 4, 3, 2, 1]
>>> number = [1,4,6,2,9,7,3] >>> number [1, 4, 6, 2, 9, 7, 3] >>> sorted(number,reverse=True) [9, 7, 6, 4, 3, 2, 1]
实际上,在高级编程语言中,排序是一个热门话题。有兴趣的读者可查阅我撰写的关于算法的文章,其中涉及排序相关话题。
至此,关于list基本操作的内置函数介绍基本完毕。最后,还要告诉读者一种学习方法。由于Python内置函数众多,仅靠教程难以穷尽,最关键的是要学会自行查找可用函数。如何查找?
一个非常重要的方法。
假设有一个列表,如何知道它拥有的内置函数?请使用help(),帮助我吧。
>>> help(list) 即可查看所有关于list的函数及其使用方法。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













