列表是有序的元素序列,在 Python 中,列表由内置的 list 类型定义。
要创建列表,需要将所有项(元素)放在方括号([]
)内,以逗号(,
)分隔。
>>> li = ['H','e','l','l','o']
>>> print(li)
['H', 'e', 'l', 'l', 'o']
>>> type(li)
<class 'list'>
一. 访问列表中的元素
二. 更新列表
1. 元素赋值
根据编号对列表中的某个元素重新赋值。
>>> li=[1,2,3,4,5]
>>> li
[1, 2, 3, 4, 5]
>>> li[3]=3
>>> li
[1, 2, 3, 3, 5]
【注】可以对一个列表中的元素赋不同类型的值。
>>> li[2]='Hello'
>>> print(li)
[1, 2, 'Hello', 3, 5]
>>> type(li)
<class 'list'>
>>> type(li[1])
<class 'int'>
>>> type(li[2])
<class 'str'>
【注】不能为一个不存在的元素赋值,可以对初始化过的位置赋值。
>>> li
[1, 2, 'Hello', 3, 5]
>>> li[5]='World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> tring=[None]*5
>>> tring[3]='test'
>>> tring
[None, None, None, 'test', None]
2. 增加元素
append() 方法用于在列表末尾添加新的对象。
语法:
list.append(obj)
- obj -- 添加到列表末尾的对象。
- 返回值:该方法无返回值,但是会修改原来的列表。
>>> tring='Hello '
>>> li=[1,2,3,4]
>>> li.append(5)
>>> li
[1, 2, 3, 4, 5]
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
extend()方法语法:
list.extend(seq)
- seq -- 元素列表。
- 返回值:该方法没有返回值,但会在已存在的列表中添加新的列表内容。
>>> li
[1, 2, 3, 4, 5]
>>> li0=['Hello','World']
>>> li.extend(li0)
>>> li
[1, 2, 3, 4, 5, 'Hello', 'World']
>>> li.extend(li[2:])
>>> li
[1, 2, 3, 4, 5, 'Hello', 'World', 3, 4, 5, 'Hello', 'World']
【注】extend() 方法和序列相加的主要区别是:
extend() 方法修改了被扩展的序列;原始的连接操作会返回一个全新的列表。
>>> li=[1,2,3,4]
>>> li0=['Hello','World']
>>> li + li0
[1, 2, 3, 4, 'Hello', 'World']
>>> li
[1, 2, 3, 4]
【注】可以用分片赋值实现与 extend() 方法同样的结果
>>> li0=['Hello','World']
>>> li=[1,2,3,4]
>>> li0[len(li0):]=li
>>> li0
['Hello', 'World', 1, 2, 3, 4]
3. 删除元素
可以使用关键字 del,从列表中删除一个或多个元素,甚至可以完全删除列表。
>>> li = ['p', 'y' , 't', 'h', 'o', 'n']
>>> del li[2]
>>> print(li)
['p', 'y', 'h', 'o', 'n']
>>> del li[1:3] #删除第 2 个到底 3 个元素
>>> print(li)
['p', 'o', 'n']
>>> del li[1:] #删除第 2 个以后的所有元素
>>> print(li)
['p']
>>> del li #删除整个列表
>>> print(li)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'li' is not defined
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
- pop()方法语法: list.pop([index=-1])
- 参数: obj -- 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。
- 返回值: 该方法返回从列表中移除的元素对象。
- pop 方法是唯一一个既能修改列表又能返回元素值(除了 None)得列表方法
- append 方法可以实现 Python 入栈方法。
- 如果入栈(追加)刚刚出栈的值,则结果不变 li.append(li.pop())
>>> li = ['曾', '梦', '想', '仗', '剑', '走', '天', '涯']
>>> li.append(li.pop())
>>> li
['曾', '梦', '想', '仗', '剑', '走', '天', '涯']
>>> li.pop()
'涯'
>>> li
['曾', '梦', '想', '仗', '剑', '走', '天']
>>> li.pop(3) #移除编号为 3 的元素
'仗'
>>> li
['曾', '梦', '想', '剑', '走', '天']
>>> li.pop(8) #编号非法
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
remove() 函数用于移除列表中某个值的第一个匹配项。
-
remove()方法语法: list.remove(obj)
-
参数: obj -- 列表中要移除的对象。
-
返回值: 该方法没有返回值但是会移除两种中的某个值的第一个匹配项。
-
值移除第一次出现的值,第二次出现的值不会被移除。
>>> print(li)
['梦', '里', '梦', '者', '梦', '中', '梦']
>>> li.remove('中')
>>> print(li)
['梦', '里', '梦', '者', '梦', '梦']
>>> li.remove('梦') #只删除第一个
>>> print(li)
['里', '梦', '者', '梦', '梦']
>>> li.remove('嗯哼') #删除列表不存在元素
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
还可以通过将一个空列表分配给一个元素切片的方式来删除列表中的项目
>>> print(li)
['P', 'y', 't', 'h', 'o', 'n']
>>> li[3:] = []
>>> print(li)
['P', 'y', 't']
4. 分片赋值
- list() 函数可以直接将字符串转换为列表
- 可以通过分片赋值直接对列表进行变更
- 可以使用与原序列不等长的序列将切片替换
- 可以在不替换任何原有元素的情况下在任意位置插入新元素
- 通过插入空列表实现删除
>>> li = list("Hello World")
>>> print(li)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> li[6:]=list('zth')
>>> print(li)
['H', 'e', 'l', 'l', 'o', ' ', 'z', 't', 'h']
>>> li[1:5]=list('i')
>>> print(li)
['H', 'i', ' ', 'z', 't', 'h']
>>> li[2:]=[]
>>> print(li)
['H', 'i']
>>> li[1:1]=list('dd')
>>> print(li)
['H', 'd', 'd', 'i']
三. 嵌套列表
>>> a=list('abc')
>>> b=list('123')
>>> x=[a,b] #注意没有引号
>>> x
[['a', 'b', 'c'], ['1', '2', '3']]
>>> x[0]
['a', 'b', 'c']
>>> x[0][0]
'a'
四. 列表函数&方法
方法的调用语法:
对象.方法(参数)
Python内置函数:
函数 | 描述 |
---|---|
all() | 如果列表中的所有元素都是 True(或者列表为空),则返回 True。 |
any() | 如果列表中的所有元素都是 True,则返回 True;如果列表为空,则返回 False。 |
enumerate() | 返回一个枚举对象,其中包含了列表中所有元素的索引和值(配对)。 |
len() | 返回列表的长度(元素个数)。 |
max() | 返回列表的最大项 |
min() | 返回列表的最小项 |
sorted() | 返回一个排序的新列表(不排序列表本身) |
sum() | 返回列表的所有元素之和 |
list() | 将 iterable(元组、字符串、集合、字典)转换为列表 |
列表的方法:
方法 | 描述 |
---|---|
append() | 将元素添加到列表的末尾 |
extend() | 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
insert() | 在定义的索引处插入一个元素 |
remove() | 移除列表中某个值的第一个匹配项 |
pop() | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
clear() | 从列表中删除所有元素 |
index() | 从列表中找出某个值第一个匹配项的索引位置 |
count() | 统计某个元素在列表中出现的次数 |
sort() | 对原列表进行排序 |
reverse() | 反转列表中元素的顺序 |
copy() | 返回一个列表的浅拷贝 |
1. append()
append()方法语法:
list.append(obj)
- 参数: obj -- 添加到列表末尾的对象。
- 返回值:该方法无返回值,但是会修改原来的列表。
2. count()
count() 方法用于统计某个元素在列表中出现的次数。
count()方法语法:
list.count(obj)
- 参数:obj -- 列表中统计的对象。
- 返回值:返回元素在列表中出现的次数。
>>> li = list("Hello World")
>>> li
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print("列表 li 中有", li.count('o')," 个 o")
列表 li 中有 2 个 o
>>> print("列表 li 中有", li.count('l')," 个 l")
列表 li 中有 3 个 l
>>> li = [[1,3],1,3,[1,3]]
>>> print("嵌套列表 li 中有", li.count([1,3])," 个列表 [1,3]")
嵌套列表 li 中有 2 个列表 [1,3]
3. extend()
extend()方法语法:
list.extend(seq)
- seq -- 元素列表。
- 返回值:该方法没有返回值,但会在已存在的列表中添加新的列表内容。
4. index()
ndex() 函数用于从列表中找出某个值第一个匹配项的索引位置。
index()方法语法:
list.index(obj)
- 参数: obj -- 查找的对象。
- 返回值: 该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
>>> li = ['Hello','World','Hello','Python']
>>> li.index('Hello')
0
>>> li.index('Python')
3
>>> li.index('python')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'python' is not in list
5. insert()
insert() 函数用于将指定对象插入列表的指定位置。
insert()方法语法:
list.insert(index, obj)
- index -- 对象obj需要插入的索引位置。
- obj -- 要插入列表中的对象。
- 返回值: 该方法没有返回值,但会在列表指定位置插入对象。
>>> li = ['Hello', 'World', 'Hello', 'Python']
>>> li.insert(2,'Hello ,zth')
>>> li
['Hello', 'World', 'Hello ,zth', 'Hello', 'Python']
6. pop()
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
pop()方法语法:
list.pop([index=-1]])
- 参数: index -- 可选参数,要移除列表元素的索引值,不能超过列表总长度,默认为 index=-1,删除最后一个列表值。
- 返回值: 该方法返回从列表中移除的元素对象。
7. remove()
remove() 函数用于移除列表中某个值的第一个匹配项。
remove()方法语法:
list.remove(obj)
-
参数: obj -- 列表中要移除的对象。
-
返回值: 该方法没有返回值但是会移除两种中的某个值的第一个匹配项。
8. reverse()
reverse() 函数用于反向列表中元素。
reverse()方法语法:
list.reverse()
返回值: 该方法没有返回值,但是会对列表的元素进行反向排序
>>> print(li)
['Hello', 'World', 'Hello ,zth', 'Hello', 'Python']
>>> li.reverse()
>>> print(li)
['Python', 'Hello', 'Hello ,zth', 'World', 'Hello']
【扩展】如果需要对一个序列进行反向迭代,那么可以使用 reversed 函数。这个函数并不返回了表,而是返回一个迭代器对象,可以通过 list 函数把返回的对象转换为列表。
>>> num = [1,2,3]
>>> list(reversed(num))
[3, 2, 1]
>>> num
[1, 2, 3]
9. sort()
sort() 函数用于对原列表进行排序,如果指定参数,则使用参数指定的比较方法进行排序。
sort()方法语法:
list.sort(cmp=None, key=None, reverse=False)
- cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
- key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
- 返回值: 该方法没有返回值,但是会对列表的对象进行排序。
sort() 方法没有返回值,sort() 方法改变了原来的列表,而不是返回一个已排序的列表副本。
>>> num = [5,8,1,3,6]
>>> n= num.sort()
>>> print(n)
None
>>> print(num) #列表 num 排序后的结果
[1, 3, 5, 6, 8]
若不将元列表切片后赋值给另一个变量,则两个列表都会被排序(因为简单赋值后,两个列表都指向同一个列表)
>>> num = [5,8,1,3,6]
>>> n = num
>>> n.sort()
>>> print(n) #n 排序后的结果
[1, 3, 5, 6, 8]
>>> print(num) #num 也被排序了
[1, 3, 5, 6, 8]
>>> num = [5,8,1,3,6]
>>> n = num[:] #将列表 num 切片后赋值给 n
>>> n.sort()
>>> print(n) #n 排序后的结果
[1, 3, 5, 6, 8]
>>> print(num) #num 保持原样
[5, 8, 1, 3, 6]
通过指定 key 和 reverse 按特定方式进行排序。
>>> field = ['study', 'python', 'is', 'happy']
>>> field.sort(key=len) #按字符串由短到长排序
>>> field
['is', 'study', 'happy', 'python']
>>> field.sort(key=len, reverse=True) #按字符串由长到短排序
>>> field
['python', 'study', 'happy', 'is']
用 sorted 函数直接获取列表的副本进行排序,sorted 函数可以用于任何序列,返回结果都是一个列表。
>>> num = [5,8,1,3,6]
>>> n = sorted(num)
>>> n
[1, 3, 5, 6, 8]
>>> num
[5, 8, 1, 3, 6]
>>> sorted('python')
['h', 'n', 'o', 'p', 't', 'y']
>>> sorted('321')
['1', '2', '3']
10. clear()
clear() 函数用于清空列表,类似于 del a[:]。
clear()方法语法:
list.clear()
- 参数: 无。
- 返回值: 该方法没有返回值。
>>> num
[5, 8, 1, 3, 6]
>>> num.clear()
>>> num
[]
11. copy()
copy() 函数用于复制列表,类似于 a[:]。
copy()方法语法:
list.copy()
- 参数: 无。
- 返回值: 返回复制后的新列表。
>>> list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
>>> list2 = list1.copy()
>>> list2
['Google', 'Runoob', 'Taobao', 'Baidu']