人生苦短,我学python之列表(中)

个人主页:星纭-CSDN博客

系列文章专栏:Python

踏上取经路,比抵达灵山更重要!一起努力一起进步!

目录

1.列表的嵌套 

2.列表中元素的顺序

3.遍历列表

4.range()函数 

5.深入理解range(x, y, z)的运行过程 

6.列表统计函数

 7.列表生成


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 

  1. x = 0
  2. 0 < 20
  3. 输出0
  4. x = 0 + 4 = 4
  5. 4 < 20
  6. 输出4
  7. x = 4 + 4 = 8
  8. 8 < 20
  9. 输出8
  10. x = 8 + 4 = 12
  11. 12 < 20
  12. 输出12
  13. x = 12 + 4 =16
  14. 16 < 20
  15. 输出16
  16. x = 16 + 4 = 20
  17. 20 = 20
  18. 结束 

以上我们将的都是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)

  • 54
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值