个人主页:星纭-优快云博客
系列文章专栏:Python
踏上取经路,比抵达灵山更重要!一起努力一起进步!
目录
1.列表的嵌套
列表既然可以存储任何类型的元素,那么也应该可以存储列表。这称为列表的嵌套
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(a) # 输出[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
那么如何访问列表中的列表中的元素呢?
如果读者学过C/C++或者Java语言,可以把此时的列表看作一个二维数组。
如果我们要找到5这个元素就是a[1][1],a[1]就是第二列表了再加上[1]就是列表中的第二个元素,也就是数值5了。
同理类比跟高维的数值,就可以不断使用[]来访问元素了。
2.列表中元素的顺序
如果,有一个列表,其中的元素全是数值,并且是无序的,有没有函数可以对这个列表中的元素进行排序呢?
sort()函数
a = [5, 3, 4, 1, 2]
a.sort()
print(a) # 输出[1, 2, 3, 4, 5]
sort()函数是一种用于对列表进行排序的内置函数。它不返回一个新的列表,而是直接修改原始列表。sort()函数有两个可选参数,key和reverse。
key参数用于指定一个函数,该函数将用于为列表中的每个元素提供一个排序关键字。可以理解为排序的规则。
reverse的意思是反转,这个参数的取值有两种True或者False,默认情况下是False,即按照排序的规则进行升序排序。True,就是降序了。
numbers = [5, 2, 9, 1, 3]
numbers.sort()
print(numbers) # 输出:[1, 2, 3, 5, 9]
fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
fruits.sort(reverse=True)
print(fruits) # 输出:['elderberry', 'date', 'cherry', 'banana', 'apple']
animals = ['elephant', 'tiger', 'giraffe', 'zebra']
animals.sort(key=len)
print(animals) # 输出:['tiger', 'zebra', 'elephant', 'giraffe']
sort()函数的参数key可以取以下值:
1. 函数:可以传入一个自定义函数,用于指定排序规则。函数接收一个参数,返回一个用于比较的值。
2. 字符串函数:可以传入一个字符串函数名称,表示要使用的属性或方法。例如,如果要按照字符串的长度进行排序,可以使用`key=len`。
3. Lambda函数:可以传入一个lambda函数,用于指定排序规则。Lambda函数是一种匿名函数,可以在一个表达式中定义并立即使用。
4. None:如果不传入key参数,将使用默认的比较函数进行排序。默认情况下,sort()函数会按照元素的大小进行排序。
需要注意的是,传入的key参数必须是一个可调用的对象。
sort函数其实也可以对字符串进行排序,按照字符的Unicode码值进行比较。
Unicode码值是一个用于表示字符在计算机中的唯一编码值。Unicode(统一码、万国码、单一码)是一种计算机中用于电子通信的标准字符编码系统,它涵盖了全球各种语言的字符,使得不同语言之间可以相互转换和显示。
每一个字符在Unicode标准中都有一个唯一的码位(Code Point),通常用十六进制数表示。例如,字符"A"的Unicode码值是U+0041,字符"中"的Unicode码值是U+4E2D。
Unicode码值有多个版本,其中最常用的是UTF-8、UTF-16和UTF-32。UTF-8是一种可变长度的编码方式,对于ASCII字符,它使用1个字节,对于其他字符,则使用2至4个字节来表示。UTF-16使用固定长度的16位(2字节)或32位(4字节)来表示字符。UTF-32则使用固定长度的32位(4字节)来表示字符。
Unicode码值的应用非常广泛,包括网页开发、软件国际化、数据库存储等。通过使用Unicode编码,可以确保不同语言之间的字符能够正确显示和转换,促进全球范围内的信息交流。
比较时大的胜出,如果相同则比较下一个字符,这里的比较结果类似于字典序的排序结果。
sort函数的使用会直接导致原列表中元素的顺序发生改变,如果我们不想使其改变怎么办呢?
此时我们就要使用sorted()函数。
这个函数将返回排序好了的列表,同时保持原列表不变。
a = [5, 3, 4, 1, 2]
b = sorted(a)
print(a) # [5, 3, 4, 1, 2]
print(b) # 输出[1, 2, 3, 4, 5]
sorted的函数也可以使用key和reverse参数。功能与sort一样。
reverse()函数
a = [1, 2, 3, 4, 5]
a.reverse()
print(a) # 输出[5, 4, 3, 2, 1]
reverse函数并不会对列表中的元素进行排序,只是将列表内的元素顺序进行颠倒。
3.遍历列表
列表中的元素是有序的,从左到右依次排序。
如何遍历列表呢,我们可以通过for循环遍历。
for <循环变量> in <遍历数据集>:
<代码块>
a = [1, 2, 3, 4, 5]
for x in a:
print(x, end=' ') # 输出1 2 3 4 5
上述的代码中,列表的变量有多少个,循环就进行多少次,变量x的取值顺序与列表中的元素的排列顺序相同。
4.range()函数
range()函数是一个内置函数,用于生成一个指定范围内的整数序列。它的常用语法形式为:
range(start, stop, step)
for i in range(1, 5):
print(i, end='') # 输出1234
在上面的代码中,1代表起始值,5是终止值。但是从输出结果来看,并没有打印5,说明这是一个前闭后开区间,也就是 i为整数并且 0<= i < 5
第三个参数是干嘛的呢?
步长默认情况下是1,也就是每次走一步。
for i in range(0, 10, 2):
print(i, end='') # 输出02468
通过上述代码13579并没有打印,也就是走了两步。
还有这样的循环 :
for i in range(10):
print(i, end='') # 输出0123456789
如果只有一个参数,那么在这个参数就是stop,start不写默认为0,step不写默认为1.
range(5)等效于一个数值列表[0, 1, 2, 3, 4]
range(x, y)在python解释器中并不是一个真正的列表,而是新的数据类型
a = range(10)
print(type(a)) # 输出<class 'range'>
range也是一个数据类型,只不过不常用而已。
如果想要把range转化为列表,我们就需要使用list()函数将其转化为列表。
a = range(10)
print(type(a)) # 输出<class 'range'>
a = list(a)
print(type(a), a) # 输出<class 'list'> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5.深入理解range(x, y, z)的运行过程
如果你有C/C++的编程经历,你就会很容易理解运行过程.
int i = 0;
for(i = x; i < y; i+=z){
;
}
流程图:
for i in range(0, 20, 4):
print(i, end=' ')
以下以上述代码举例为何输出:0 4 8 12 16
- x = 0
- 0 < 20
- 输出0
- x = 0 + 4 = 4
- 4 < 20
- 输出4
- x = 4 + 4 = 8
- 8 < 20
- 输出8
- x = 8 + 4 = 12
- 12 < 20
- 输出12
- x = 12 + 4 =16
- 16 < 20
- 输出16
- x = 16 + 4 = 20
- 20 = 20
- 结束
以上我们将的都是step为正数的
读者可以尝试以下代码
for i in range(20, 0, -4):
print(i, end=' ')
输出:20 16 12 8 4
6.列表统计函数
max(),min(),sum()函数是python中常用的列表统计函数,其分别是求列表元素中的最大值,最小值,所有元素的值之和。前提条件是元素必须是数值。
因为有len()函数的存在,我们可以很容易的求出平均值了。
a = [1, 3, 5, 7, 9]
print(max(a), min(a), sum(a)) # 输出9 1 25
如果存在其他类型的数据,就会抛出异常
pri
nt(max(a), min(a), sum(a))
^^^^^^
TypeError: '>' not supported between instances of 'str' and 'int'
这个错误是类型错误,字面意思是浮点数与字符串之间不支持+号操作,就是无法让浮点数与字符串进行求和。
7.列表生成
如果我们想要得到整数5-10的立方再加上2的所有值的列表,python只需要一行代码即可解决。
a = [x**3 + 2 for x in range(5, 11)]
print(a) # 输出[127, 218, 345, 514, 731, 1002]
这个代码第一次看可能难以理解,简单来说,x**3 + 2是列表中的元素,因为循环得到了不同的值,均存放在这个列表中。
如果想要生成一个10行8列的矩阵呢?
a = [0] * 8
# 把0作为元素的一个大小为8的列表
print(a)
a = [[0] * 8] * 10
# 把[0] * 8这样一个列表当作元素的的一个大小为10的列表
print(a)
如果我们希望将矩阵中每一个位置上的值初始化为行号乘以列号呢?
a = [[r * c for c in range(1, 9)] for r in range(1, 11)]
print(a)
这里可以理解为两层嵌套循环
for r in range(1, 11):
for c in range(1, 9):
a = r * c
列表中for循环还可以搭配if语句使用:
a = [x for x in range(10) if x % 3 == 0]
print(a) # 输出[0, 3, 6, 9]
不难发现,只有满足if语句后面的条件的x值才可以参与列表的生成。
在列表的快速生成中,for循环也可以嵌套着调用。
a = [x + y for x in 'abc' for y in 'def']
print(a) # 输出['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']
注意:这里的遍历数组集也可以是字符串,从第一个字符依次遍历。
上述的代码等价于:
a = []
for x in 'abc':
for y in 'def':
a.append(x + y)
print(a)