列表:用于存储任意数目、任意类型的数据集合。
列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:
>>>a=[10,20,30,40]
其中,10,20,30,40这些称为:列表a的元素。
列表中的元素可以各不相同,可以是任意类型。比如:
a=[10,20,’abc’,True]
列表对象的常用方法汇总如下,方便大家学习和查阅。
方法 | 说明 | 结果 |
---|---|---|
list.append(x) | 增加元素 | 将元素增加到list尾部 |
list.extend(aList) | 增加元素 | 将列表alist的所有元素增加到list尾部 |
list.insert(index,x) | 增加元素 | 在列表指定index位置插入元素 |
list.remove(x) | 删除元素 | 删除首次出现的指定元素 |
list.pop([index]) | 删除元素 | 删除并返回列表,指定index处为止的元素,默认是最后一个 |
list.clear() | 删除元素 | 删除所有元素 |
list.index(x) | 访问元素 | 返回指定index处的元素 |
list.count(x) | 访问元素 | 返回x出现的次数 |
len(list) | 访问元素 | 统计元素个数 |
list.reverse() | 反转列表 | 所有元素反转 |
reversed(list) | 内置函数,不对原列表做修改,返回一个逆序排列的迭代器对象,遍历完就空了 | |
list.sort() | 排序 | 所有元素排序,默认升序,加reverse=True 降序 |
sorted(list) | 排序 | 内置函数,排序 |
list.copy() | 浅拷贝 | 返回对象浅拷贝 |
random.shuffle(list) | 打乱排序 | import random |
max(list) | 返回最大值 | |
min(list) | 返回最小值 |
python列表大小可变,随时增加或缩小
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。我们前面学习的很多字符串的方法,在列表中也有类似的用法,几乎一模一样。
基本语法创建
>>>a=[10,20,'sxw']>>>a=[]
list ()创建
使用ist0可以将任何可迭代的数据转化成列表。
>>>a=list()>>>a=list(range(10))>>>a=list("sss","ddd")
range()创建整数列表
range0可以帮助我们非常方便的创建整数列表,这在开发中及其有用。语法格式为:
range([start,]end [,step])
start参数:可选,表示起始数字。默认是0
end参数:必选,表示结尾数字。
step参数:可选,表示步长,默认为1
python3中range()返回的是一个range对像,而不是列表。我们需要通过list()方法将其转换成列表对象。
>>>list(range(3,15,2))[3,5,7,9,11,13]
推导式生成列表
使用列表推导式可以非常方便的创建列表,在开发中经常使用。但是,由于涉及到for循环和if语句。在此,仅做基本介绍。在我们控制语句后面,会详细讲解更多列表推导式的细节。
>>>a=[x*2 for x in range(5)] // 循环创建多个元素>>>a=[x*2 for x in range(5) if x%9==9] // 循环创建多个元素 加过滤条件
列表元素的增加和删除
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一股只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。
append()方法 **
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。
>>>a=[20,40]>>>a.append(80)
+运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象:将原列表的元素和新列表的元素依次复制到新的列表对象中。这样会涉及大量的复制操作,对于操作大量元素不建议使用。
>>>a=[20,40]>>>a=a+[50]
extend()方法 **
将目标列表的所有元素添到本列表的尾部,属于原地操作,不创建新的列表对象。
>>>a=[20,40]>>>a.extend([50])
insert()插入元素
使用insert()方法可以将制定元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。
>>>a=[20,40,60]>>>a.insert(2,80)[20,40,80,60]
del删除
删除指定位置的元素
>>>a=[10,20,30]>>>del a[1]
pop()方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素
>>>a=[10,20,30,40]>>>a.pop()40>>>a[10,20,30]>>>a.pop(1)20
remove方法
删除首次出现的指定元素,若不存在该元素则抛出异常
>>>a=[10,20,30,40,50,20,30,20]>>>a.remove(20)>>>a[10,30,40,50,20,30,20] 第一个20被删除>>>a.remove(100)异常
列表元素访问和计数
通过索引直接访问元素
我们可以通过索引直接访问元素。索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。
>>>a=[10,20,30,40,50,20,30,20]>>>a[0]10>>>a[100]异常
index()获得指定元素在列表中首次出现的索引
index0可以获取指定元素首次出现的索引位置。语法是:index(value,[start],[end])。其中,start和end指定了搜索的范围。
>>>a=[10,20,30,40,50,20,30,20]>>>a.index(10)0>>>a.index(20,2)5
count获得指定元素在列表中的出现次数
>>>a=[10,20,30,40,50,20,30,20]>>>a.count(20)3
len()返回列表长度
>>>a=[10,20,30,40,50,20,30,20]>>>len(a)8
成员资格判断in, not in
判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般我们会使用更加简洁的in关键字来判断,直接返回True或False。
>>>a=[10,20,30,40,50,20,30,20]>>>20 in aTrue>>>100 not in aTrue
切片操作
我们在前面学习字符串时,学习过字符串的切片操作,对于列表的切片操作和字符串类似。切片是Python序列及其重要的操作,适用于列表、元组、字符串等等。切片的格式如下:
切片slice操作可以让我们快速提取子列表或修改。标准格式为:
[起始偏移量 start: 终止偏移量end [:步长step]]
注:当步长省略时顺便可以省略第二个冒号
典型操作(三个量为正数的情况)如下:
操作 | 示例 | 结果 |
---|---|---|
[:] 提取整个列表 | [10,20,30][:] | [10,20,30] |
[start:] 从start索引开始到结尾 | [10,20,30][1:] | [20,30] |
[:end] 从开头开始知道end-1 | [10,20,30][:2] | [10,20] |
[start:end] 从start到end-1 | [10,20,30][1:3] | [20,30] |
[start:end\:step] 从start提取到end-1,步长是step | [10,20,30][1:6:2] | [20,40,60] |
其他操作(三个量为负数)的情况:
操作 | 示例 | 结果 |
---|---|---|
倒数3个 | [10,20,30,40,50,60,70][-3:] | [50,60,70] |
倒数第五个到倒数第三个(包头不包尾) | [10,20,30,40,50,60,70][-5:-3] | [30,40] |
步长为负,从右到左反向提取 | [10,20,30,40,50,60,70][::-1] | [70,60,50,40,30,20,10] |
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成-1。例如:
>>>[10,20,30,40][1:30][20,30,40]
输出正常结果,没有报错
列表遍历
for obj in listObj: print(obj)
列表排序
修改原列表,不建新列表的排序
>>>a=[20,10,30,40]>>>id(a)46017816>>>a.sort() #默认是升序排列>>>a[10,20,30,40]>>>a.sort(reverse=True) #降序排列>>>a[40,30,20,10]>>>import random>>>random.shuffle(a) #打乱顺序>>>a[20,10,30,40]>>>id(a)46017816
建立新表,排序
我们也可以通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改。
>>>a=[20,10,30,40]>>>id(a)46017816>>>b=sorted(a) #默认升序>>>b[10,20,30,40]>>>id(b)46084612>>>c=sorted(b,reverse=True) #降序>>>c[40,30,20,10]>>>id(c)45123188
通过上面操作,我们可以看出,生成的列表对象b和C都是完全新的列表对象。
reversed()返回迭代器
内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。
>>>a=[20,10,30,40]>>>c=reversed(a)>>>c<list_reverseiterator object at 0x0000027B189EB850>>>>list(c)[40,30,20,10]>>>list(c)[]
我们打印输出c发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list(c)进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
列表相关的其他内置函数汇总
max和min
用于返回列表中最大和最小值
>>>a=[3,10,20,15,9]>>>max(a)20>>>min(a)3
sum
对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。
>>>a=[3,10,20,15,9]>>>sum(a)>>>57
多维列表
一维列表可以帮助我们存储一维、线性的数据。
二维列表可以帮助我们存储二维、表格的数据。例如下表的数据:
姓名 | 年龄 | 薪资 | 城市 |
---|---|---|---|
张三 | 18 | 30000 | 北京 |
李四 | 19 | 20000 | 上海 |
赵五 | 20 | 10000 | 深圳 |
a=[ ["张三",18,30000,"北京"], ["李四",19,20000,"上海"], ["赵五",20,10000,"深圳"]]//遍历输出for i in range(len(a)): for j in range(len(i)): print(a[i][j],end="\t") #\t 打完换行