列表
特点:有序,长度可变,且包含的内容均可修改的序列,即支持增删改查
列表的创建:
创建列表可以采用如下几种方式:
(1)使用方括号:lst = [1,2,4,True, None]
(2)使用元组来创建:list(tuple)
(3)使用迭代器/生成器:list(range(10)), range(0,10,3)
(3.1.) 列表生成器range,前开后闭,生成的都是整数,range虽然不是一个列表,但是它能像列表一样被索引
lst1 = [1,2,4,True, None]
tup = (8, 9 , 13, 'hello')
lst2 = list(tup)
ran = range(1, 10)
lst3 = list(ran)
print(lst1, type(lst1))
print(lst2, type(lst2))
print(ran, type(ran))
print(lst3, type(lst3))
-----------------------------------
[1, 2, 4, True, None]
[8, 9, 13, 'hello']
range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
增删元素
列表是有序可变的序列,那么它必然会支持增删改查:
(1)增
- 使用+进行列表的连接,此时会产生一个新的列表,不会改变原始列表
list+[1,2,3]:生成一个新的list,不会改变lst
lst1 = list(range(9))
print(lst1)
lst2 = lst1 + [99, 88, 77]
print(lst1)
print(lst2)
--------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 88, 77]
- 使用list.append(value/list)方法,在列表的末尾进行插入,此时会在原始列表的末尾进行元素的添加
list.append(element/lst)
lst1 = list(range(9))
print(lst1)
lst1.append([99, 88, 77])
print(lst1)
---------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, [99, 88, 77]]
- 使用list.extend(list)方法,在列表中同时添加多个元素,该方法与上述append方法的主要区别在于,append会在原始列表末尾直接插入一个新添的列表,而extend是直接在末尾添加多个元素,该方法与“+”的区别在于不会产生新的列表,直接在原始列表上进行修改。
list.extend([1,23,4])
lst1 = list(range(9))
print(lst1)
lst1.extend([99, 88, 77])
print(lst1)
---------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 99, 88, 77]
- 使用list.insert(index, value)在对应的位置index上插入对应的值value
list.insert(3, 'world'):在index为3的位置插入'world'
lst = [5,9, 3, 'hello']
print(lst)
lst.insert(3, 'world')
print(lst)
---------------------------
[5, 9, 3, 'hello']
[5, 9, 3, 'world', 'hello']
(2)删
- list.pop(index):将特定位置index的元素移除
lst = list(range(7))
print(lst)
print(lst.pop())
print(lst)
------------------------
[0, 1, 2, 3, 4, 5, 6]
6
[0, 1, 2, 3, 4, 5]
- list.remove(value):定位第一个符合要求的值/value并移除
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
print(lst.remove('red'))
print(lst)
---------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
None
[55, 88, 4, 4, 'yellow', 'red']
- list.clear():清除所有的元素
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
print(lst.clear())
print(lst)
----------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
None
[]
- del list[0]:del是一个语句,删除了第一个元素; del lst[:4]
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
del lst[:4]
print(lst)
-------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
['red', 'yellow', 'red']
(3)改查
列表的修改比较简单,通过索引的方式直接修改列表中对应的元素
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst)
lst[4] = 'black'
print(lst)
--------------------------------------
[55, 88, 4, 4, 'red', 'yellow', 'red']
[55, 88, 4, 4, 'black', 'yellow', 'red']
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst[3:])
-------------------------------
[4, 'red', 'yellow', 'red']
列表连接和联合
列表的连接与联合主要有如下两种方式:
(1)+连接:两个列表直接用+进行连接
(2)lst1.extend(lst2):extend方法向该列表中添加多个元素
由于在列表的增这个部分已经介绍过这两种方式的使用,此处不再详赘述,这里主要提出一个值得关注的点:
使用+添加内容来连接列表代价比较高,过程中创建了新列表,并且还要复制对象。通常使用extend将元素添加到已经存在的列表是更好的一种方式。
成员运算
可以使用in, not in检查某个值是否在/不在列表中,返回值为布尔型。
(1)in:检查一个值是否在列表中
(2)not in:判断元素不在列表中
与字典和集合相比,检查列表中是否包含一个值是非常缓慢的,因为python在检查时
- 列表:会进行线性逐个扫描
- 字典与集合:同时检查所有元素,基于哈希表**
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print('red' in lst)
print('yellow' not in lst)
-------------------------------
True
False
列表的函数与方法
(1)函数:列表的函数有很多,此处不详细展开,需要使用的时候可以直接百度搜
len(lst)
max(lst)
min(lst)
sum(lst)
(2)方法
- list.index(element):返回元素对应的index,注意它返回的是查到的第一个元素的index
- list.count(element):计算元素出现的个数
lst = [55, 88, 4, 4, 'red', 'yellow', 'red']
print(lst.index('red')) >>> 4
print(lst.count('red')) >>> 2
- list.sort():对列表的元素进行排序
a = [88,11,4,56,100]
a.sort()
print(a)
b = ['saw', 'small','foxes']
b.sort(key=len)
print(b)
----------------------------------------
[4, 11, 56, 88, 100]
['saw', 'small', 'foxes']
列表的排序
上述提及列表的排序方法,此处我们介绍列表常用的几种排序方式:
(1)list.sort()方法:列表内部进行排序,无需创建新对象
(2)sorted(list)函数:对通用序列产生一个排序后的拷贝,排序并复制的一个函数
lst = ['foo', 'red', 'yellow', 'black']
sorted(lst, key = len, reverse=True)
----------------------------------------------
['yellow', 'black', 'foo', 'red']
(3)bisect:内建的bisect模块实现了二分搜索和已排序列表的插值,但是bisect不会检查列表是否已经排序,因为这样代价太大
bisect.bisect(lst, 2):找到元素应当被插入的位置
bisect.insort(lst,6):将元素插入到相应位置
import bisect
lst = ['foo', 'red', 'yellow', 'black']
print(bisect.bisect(lst, 'yellow'))
print(lst)
print(bisect.insort(lst, 'black'))
print(lst)
----------------------------------------
4
['foo', 'red', 'yellow', 'black']
None
['black', 'foo', 'red', 'yellow', 'black']
列表的复制
这里介绍列表一个非常重要的用法,在python中会存在列表的赋值,但是赋值之后,如果修改其中一个列表的元素, 势必也会更给另一个列表中的元素,这是因为赋值意味着两个列表的引用是一样的,这个跟python内部序列的存储有关。例如:
x = list(range(5))
m = x
x[2] = 101
此时会发现m[2]
对应的值也会发生改变,这就是需要复制的原因。
- list.copy():复制一个新的列表,此时list与复制出来的list指向两个新的列表(虽然两个列表的值相同)
lst_old = ['foo', 'red', 'yellow', 'black']
lst_new = lst.copy()
print(lst_old)
print(lst_new)
lst_old[0] = 'foolish'
print(lst_old)
print(lst_new)
-----------------------------------------
['foo', 'red', 'yellow', 'black']
['foo', 'red', 'yellow', 'black']
['foolish', 'red', 'yellow', 'black']
['foo', 'red', 'yellow', 'black']
切片
切片创建:
- 使用列表来创建切片:注意切片的索引是左闭右开
list[3:5]
切片赋值
seq[3:4] = [66,77]
切片取值
seq[:-1]
seq[-4:]
seq[:]
seq[::2]:表示每隔2个数取一个值,其中2为步长
对列表或者元组进行翻转/逆序排列
对元组或者列表进行逆序排列可以采用如下两种方式:
(1)lst[::-1]
lst = ['foo', 'red', 'yellow', 'black']
print(lst)
lst[::-1]
--------------------------
['foo', 'red', 'yellow', 'black']
['black', 'yellow', 'red', 'foo']
(2)reversed(list)函数,但是此时返回的是一个迭代器,我们需要再使用list()函数将其转换成列表
lst = ['foo', 'red', 'yellow', 'black']
print(lst)
print(reversed(lst), type(reversed(lst)))
list(reversed(lst))
-----------------------------------------------
['foo', 'red', 'yellow', 'black']
['black', 'yellow', 'red', 'foo']