列表
1. 列表
Python列表是:
- 任意对象的有序集合:列表是收集其他对象的地方,列表维护了元素的每一项从左到右的顺序,也就是说这是序列;
- 通过偏移访问:像字符串一样,可以通过列表对象的偏移对其进行索引,从而读取对象的某一部分的内容,也可以进行分片和拼接等操作;
- 可变长度、异构以及任意嵌套:列表可以在原位置增长或缩短(长度可变),并且可以包含任意类型的对象,支持任意的嵌套;
- 属于可变类型的分类:列表是可变对象(可以在原位置修改),也可以进行索引、分片以及拼接(但进行这些操作时返回的是新列表),还支持删除和索引赋值操作(会在原位置修改列表)
- 对象引用数组:从技术上讲,Python列表包含了一个或多个其他对象的引用。
1.1 常用列表字面量和操作
2. 列表的实际应用
2.1 列表基本操作
2.1.1 列表操作符
>>> len([1, 2, 3]) # 求列表长度
3
>>> [1, 2, 3] + [4, 5, 6] # 列表拼接
[1, 2, 3, 4, 5, 6]
>>> ['Ni!'] * 4 # 列表重复
['Ni!', 'Ni!', 'Ni!', 'Ni!']
2.1.2 列表迭代和推导
>>> 3 in [1, 2, 3]
True
>>> for x in [1, 2, 3]:
... print(x, end=' ')
...
1 2 3
>>> res = [c * 4 for c in 'SPAM']
>>> res
['SSSS', 'PPPP', 'AAAA', 'MMMM']
>>> list(map(abs, [-1, -2, 0, 1, 2]))
[1, 2, 0, 1, 2]
# map函数会对序列的每个元素应用函数abs,并返回结果
2.1.3 索引、分片和矩阵
对列表进行索引返回的是指定的偏移处的对象,而对列表进行分片返回的是一个新的列表:
>>> L = ['spam', 'Spam', 'SPAM']
>>> L[2]
'SPAM'
>>> L[-1]
'SPAM'
>>> L[1:]
['Spam', 'SPAM']
由于可以在列表中嵌套列表,因此需要多次索引才能找到最后的元素,嵌套了子列表的列表就可以表示矩阵:
>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> matrix[1]
[4, 5, 6]
>>> matrix[1][1]
5
>>> matrix[2][0]
7
2.1.4 原位置修改列表
索引和分片的赋值
当使用列表时,可以给一个特定项或整个分片来改变它的内容:
>>> L = ['spam', 'Spam', 'SPAM']
>>> L[1] = 'eggs'
>>> L
['spam', 'eggs', 'SPAM']
>>> L[0:2] = ['eat', 'more']
>>> L
['eat', 'more', 'SPAM']
索引和分片的赋值都是在原位置上修改,而不是生成一个新的列表作为结果。
分片赋值实际上包含两步:
- 删除:删除等号左边指定的分片;
- 插入:将包含在等号右边的可迭代对象中的片段插入旧分片被删除的位置;
分片赋值不需要保证删除的元素数目与插入的元素数目相等!
>>> L = [1, 2, 3]
>>> L[1:2]
[2]
>>> L[1:2] = [4, 5] # 相当于替换2这个元素
>>> L
[1, 4, 5, 3]
>>> L[1:1] = [6, 7] # 相当于在索引1处插入列表[6, 7]中的元素
>>> L
[1, 6, 7, 4, 5, 3]
>>> L[1:2] = [] # 相当于删除6这个元素
>>> L
[1, 7, 4, 5, 3]
>>> L = [1]
>>> L[:0] = [2, 3, 4] # 相当于在头部插入
>>> L
[2, 3, 4, 1]
>>> L[len(L):] = [5, 6, 7] # 相当于在尾部插入
>>> L
[2, 3, 4, 1, 5, 6, 7]
列表方法调用
很多列表方法可以在原位置修改主体列表:
>>> L = ['eat', 'more', 'SPAM!']
>>> L.append('please')
>>> L
['eat', 'more', 'SPAM!', 'please']
>>> L.sort()
>>> L
['SPAM!', 'eat', 'more', 'please']
append
方法能够将一个单独的元素(对象引用)加至列表末端
sort
方法能将列表内的元素进行排序
列表排序
sort方法在原位置对列表进行排序,默认采用
<
进行比较排序。
list.sort(key=None, reverse=False)
- key:用于指定排序依据的函数,如果提供了
key
参数,列表中的每个元素会调用这个函数,并以其返回值作为排序的依据;- reverse:布尔值。如果设置为
True
,列表将被反向排序(降序)。默认值是False
(升序)。>>> numbers = [2, 3, 1, 5, 4] >>> numbers.sort() >>> numbers [1, 2, 3, 4, 5] # 1. 逆序排序 >>> numbers.sort(reverse=True) >>> numbers [5, 4, 3, 2, 1] # 2. 指定key参数进行排序 >>> fruits = ['apple', 'banana', 'cherry'] >>> fruits.sort(key=len) >>> fruits ['apple', 'banana', 'cherry'] >>> fruits.sort(key=str.lower) >>> fruits ['apple', 'banana', 'cherry'] # 3. 自定义排序函数 >>> def sort_by_last_letter(word): ... return word[-1] ... >>> fruits.sort(key=sort_by_last_letter, reverse=True) >>> fruits ['cherry', 'apple', 'banana']
Python提供了
sorted
内置函数用于对可迭代对象进行排序,但与list.sort
方法不同,sorted
函数不会改变原始对象而是返回新的排序后的可迭代对象。
sorted(iterable, key=None, reverse=False)
iterable:任何可迭代对象(列表、字符串、元组等)
key:用于指定排序依据的函数,如果提供了
key
参数,列表中的每个元素会调用这个函数,并以其返回值作为排序的依据;reverse:布尔值。如果设置为
True
,列表将被反向排序(降序)。默认值是False
(升序);>>> sorted_numbers = sorted(numbers) >>> sorted_numbers [1, 2, 3, 4, 5] # 1. 逆序排序 >>> sorted_numbers = sorted(numbers, reverse=True) >>> sorted_numbers [5, 4, 3, 2, 1] # 2. 指定key进行排序 >>> fruits = ['apple', 'banana', 'cherry'] >>> sorted_fruits = sorted(fruits, key=len, reverse=True) >>> sorted_fruits ['banana', 'cherry', 'apple'] # 3. 自定义排序函数 >>> def sort_by_last_letter(word): ... return word[-1] ... >>> sorted_fruits = sorted(fruits, key=sort_by_last_letter) >>> sorted_fruits ['banana', 'apple', 'cherry']
其他常见列表方法
reverse
方法可以在原位置反转列表extend
方法可以在列表末端插入多个元素pop
方法可以删除并返回列表末尾的一个元素,pop
方法也能接收一个偏移量将偏移量对应的元素从列表中删除并返回
内置的reversed
函数也可以将可迭代对象反转,不过是返回反转后的新的可迭代对象。
>>> L = [1, 2]
>>> L.extend([3, 4, 5])
>>> L
[1, 2, 3, 4, 5]
>>> L.pop()
5
>>> L
[1, 2, 3, 4]
>>> L.reverse()
>>> L
[4, 3, 2, 1]
>>> list(reversed(L))
[1, 2, 3, 4]
extend
方法 vsappend
方法
extend
方法总是会循环访问传入的可迭代对象,并逐个把产生的元素添加到列表末尾,而append
方法会直接把这个传入的可迭代对象添加到尾部而不会遍历它。
extend
方法可以向列表尾部添加多个元素,而append
方法只能添加一个。>>> L = [1, 2, 3] >>> L.extend([4, 5]) >>> L [1, 2, 3, 4, 5] >>> L = [1, 2, 3] >>> L.append([4, 5]) >>> L [1, 2, 3, [4, 5]]
remove
方法可以通过值删除列表元素,不过只会删除第一个匹配项,找不到该元素时会抛出ValueError
异常insert
方法可以在某个偏移处插入元素count
方法可以计算某元素在列表中的个数index
方法可以查找某元素的索引值,找不到该元素时会抛出ValueError
异常clear
方法可以清除列表中的所有元素
>>> L = [0, 0, 1, 2, 3]
>>> L.remove(0)
>>> L
>>> L.remove(5) # 元素不存在时抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
[0, 1, 2, 3]
>>> L.insert(1, 4) # 在索引1处插入元素4
>>> L
[0, 4, 1, 2, 3]
>>> L.count(0)
1
>>> L.index(2)
3
>>> L.index(5) # 元素不存在时抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 5 is not in list
>>> L.clear()
>>> L
[]
其他常见列表操作
由于列表是可变类型,可以使用del
语句在列表原位置删除某项或者某片段
>>> L = ['spam', 'eggs', 'ham', 'toast']
>>> del L[0]
>>> L
['eggs', 'ham', 'toast']
>>> del L[1:]
>>> L
['eggs']
也可以将列表切片赋值为[]
(空列表)来删除,但是如果给列表某个索引赋值为[]
,将会在对应位置存储空列表对象的引用而不是删除该元素
>>> L = ['Already', 'got', 'one']
>>> L[1:] = []
>>> L
['Already']
>>> L[0] = []
>>> L
[[]]
列表的copy
方法可以实现一个列表的浅拷贝,作用类似[:]
和list(L)
>>> L = [1, 2, 3]
>>> L.copy()
[1, 2, 3]
>>> L.copy is L
False
>>> L[:]
[1, 2, 3]
>>> L[:] is L
False
标签:sort,Python,元素,列表,fruits,sorted,排序
From: https://www.cnblogs.com/N1rv2na/p/18280003