30.列表排序
修改原列表,不建新列表的排序 list.sort()
>>> a = [20,10,30,40]
>>> id(a)
46017416
>>> a.sort() #默认是升序排列 a是 list list对象 list.sort()
>>> a
[10, 20, 30, 40]
>>> a = [10,20,30,40]
>>> a.sort(reverse=True) #降序排列
>>> a
[40, 30, 20, 10]
>>> import random
>>> random.shuffle(a) #打乱顺序 洗牌 将原来的对象顺序打乱
>>> a
[20, 40, 30, 10]
建新列表的排序
我们也可以通过内置函数
sorted()
进行排序,这个方法返回新列表,不对原列表做修改。
sorted
不仅可以对list
列表对象排序。 其他的 一些 可迭代对象 也是可以排序的。
>>> a = [20,10,30,40]
>>> id(a)
46016008
>>> a = sorted(a) #默认升序
>>> a
[10, 20, 30, 40]
>>> id(a)
45907848 # id 改变了 所以不是同一个 对象了。
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072 # id 改变了
>>> c = sorted(a,reverse=True) #降序
>>> c
[40, 30, 20, 10]
通过上面操作,我们可以看出,生成的列表对象b
和c
都是完全新的列表对象
。
reversed()返回迭代器
内置函数
reversed()
也支持进行逆序排列
,与列表对象reverse()
方法不同的是,内置函数
reversed()
不对原列表做任何修改,只是 返回一个逆序排列的迭代器对象。
>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x0000000002BCCEB8> # 迭代对象
>>> list(c) # 当然 也可以 用 我前面讲的 [*c] 来解包
[40, 30, 10, 20]
>>> list(c) # 再次 输出 则为空了。 这就是 迭代器。 只能使用 一次 。 所以非常节省 内存。
[]
我们打印输出c发现提示是:list_reverseiterator
。也就是一个迭代对象
。
同时,我们使用list(c)
进行输出,发现只能使用一次。第一次输出了元素,第二次为空
。
那是因为迭代对象 在第一次时已经遍历结束了 , 第二次不能再使用。
注:关于迭代对象的使用,后续章节会进行详细讲解。
列表相关的其他内置函数汇总
max
和min
用于返回列表中最大和最小值。
[40, 30, 20, 10]
>>> a = [3,10,20,15,9]
>>> max(a) # 返回最大值
20
>>> min(a) # 返回最小值
3
sum
求和。
前面讲 列表合并的 时候 简单 介绍 过
对数值型列表的所有元素进行求和操作,对
非数值型
列表运算则会报错
。
>>> a = [3,10,20,15,9]
>>> sum(a)
57
>>> sum(range(100)) # 求 0 到 100 的 和 。 小学奥数题。
5050
30.列表的遍历
for obj in listObj: # for 循环
print(obj)
复制列表所有的元素到新列表对象
如下代码实现列表元素的复制了吗?
list1 = [30,40,50]
list2 = list1
只是将 list2 也指向了列表对象,也就是说 list2 和 list2 持有
地址值
是相同的,
列表对象本 身的元素并没有复制
。
我们可以通过如下简单方式,实现列表元素内容的复制:
list1 = [30,40,50]
list2 = [] + list1 # 和我之前讲的 sum 函数 以及 + 号 合并 列表 是一样的。
注:我们后面也会学习 copy
模块,使用浅复制
或深复制
实现我们的复制操作。