辛丑年丙申月乙巳日|序列
列表
列表里存储的是对象的地址,保证了列表是轻量级,节约内存空间。
方法 | 要点 | 描述 |
---|---|---|
list.append(x) | 增加元素 | 将元素 x 增加到列表 list 尾部 |
list.extend(aList) | 增加元素 | 将列表 alist 所有元素加到列表 list 尾部 |
list.insert(index,x) | 增加元素 | 在列表 list 指定位置 index 处插入元素 x |
list.remove(x) | 删除元素 | 在列表 list 中删除首次出现的指定元素 x |
list.pop([index]) | 删除元素 | 删除并返回列表 list 指定为止 index 处的元素,默认是最后一个元素 |
list.clear() | 删除所有元素 | 删除列表所有元素,并不是删除列表对象 |
list.index(x) | 访问元素 | 返回第一个 x 的索引位置,若不存在 x 元素抛出异常 |
list.count(x) | 计数 | 返回指定元素 x 在列表 list 中出现的次数 |
len(list) | 列表长度 | 返回列表中包含元素的个数 |
list.reverse() | 翻转列表 | 所有元素原地翻转 |
list.sort() | 排序 | 所有元素原地排序 |
list.copy() | 浅拷贝 | 返回列表对象的浅拷贝 |
Python 的列表大小可变,根据需要随时增加或缩小
列表的创建
基本语法[]创建
>>>a=[10,20,'sys']
>>>a=[]#创建一个空列表对象
list()创建
>>>a=list()#创建一个空的列表对象
>>>a=list(range(10))
#range(10)是一个可迭代的range对象
#list经常把可迭代的数据转成列表
>>>a
[0,1,2,3,4,5,6,7,8,9]
>>>a=list("Laiiike,yu")
>>>a
['L','a','i','i','i','k','e',',','y','u']
range()创建整数列表
range([start,]end[,step])
中括号内不写的话start默认为0,step默认为1,end必写。
推导式生成列表
>>> a = [x*2 for x in range(100) if x%9==0]
#通过 if 过滤元素
>>> a
[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
列表的增加
append()
列表尾部添加新的元素,推荐选用。
>>> a = [20,40]
>>> a.append(80)
>>> a
[20, 40, 80]
+运算符
并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次
复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
>>> a = [20,40]
>>> id(a)
46016072
>>> a = a+[50]
>>> id(a)
46015432
extend()
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
>>> a = [20,40]
>>> id(a)
46016072
>>> a.extend([50,60])
>>> id(a)
46016072
insert()插入元素
插入列表指定位置,并对该位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。
类似的有remove(),pop(),del(),他们删除非尾部元素是也会发生操作位置后面元素的移动。
>>> a = [10,20,30]
>>> a.insert(2,100)
>>> a
[10, 20, 100, 30]
乘法扩展
>>> a = ['sxt',100]
>>> b = a*3
>>> a
['sxt', 100]
>>> b
['sxt', 100, 'sxt', 100, 'sxt', 100]
列表元素的删除
实际上也是元素的拷贝。
del 删除
删除列表指定位置的元素
指定位置后边的元素依次拷贝到前面。
>>> a = [100,200,888,300,400]
>>> del a[1]
>>> a
[100,200,300,400]
pop()方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。相当于弹夹,将最后一个元素弹出,直到列表里的元素为空。
>>> a = [10,20,30,40,50]
>>> a.pop()
50#弹出的元素
>>> a
[10, 20, 30, 40]
>>> a.pop(1)
20#弹出的元素
>>> a
[10, 30, 40]
remove()
删除首次出现的指定元素,若不存在该元素抛出异常。
括号里放的是元素是值而不是索引。
>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.remove(20)
>>> a
[10, 30, 40, 50, 20, 30, 20, 30]
>>> a.remove(100)
Traceback (most recent call last):
File "<pyshell#208>", line 1, in <module>
a.remove(100)
ValueError: list.remove(x): x not in list
列表元素访问和计数
通过索引直接访问元素
[0, 列表长度-1],超过这个范围则会抛出异常。
>>> a = [10,20,30,40,50,20,30,20,30]
>>> a[2]
30
index()获得指定元素在列表中首次出现的索引。
index(value,[start,[end]])
>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.index(20)
1
>>> a.index(20,3) #从索引位置 3 开始往后搜索的第一个 20
5
>>> a.index(30,5,7) #从索引位置 5 到 7 这个区间,第一次出现 30 元素的位置
6
count()获得指定元素在列表中出现的次数
count()可以返回指定元素在列表中出现的次数。
>>> a = [10,20,30,40,50,20,30,20,30]
>>> a.count(20)
3
len()返回列表长度
len()返回列表长度,即列表中包含元素的个数。
>>> a = [10,20,30]
>>> len(a)
3
成员资格的判断
in/not in
在为True,不在为False。
(也可以用count()>0判断)
切片操作
[起始偏移量 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,40][1:3] | [20,30] |
[start:end:step] 从 start 提取到 end-1,步长是 step | [10,20,30,40,50,60,70][1:6:2] | [20, 40,60] |
三个量是负数
示例 | 说明 | 结果 |
---|---|---|
[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] |
列表的遍历
for obj in listObj:
print(obj)
复制列表所有的元素到新列表对象
list1 = [30,40,50]
list2 = list1
#将list2指向列表对象,列表对象本身元素并没有复制
list1 = [30,40,50]
list2 = []
#实现复制操作
列表排序
修改原列表,不建新列表
>>> a = [20,10,30,40]
>>> a.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]
建新列表的排序
>>> a = [20,10,30,40]
>>> id(a)
45840584
>>> b = sorted(a)
>>> b
[10, 20, 30, 40]
>>> id(a)
45840584
>>> id(b)
46016072#生成新对象
>>> c = sorted(a,reverse=True) #降序
>>> c
[40, 30, 20, 10]
reverse()返回迭代器
包含一个指针,从列表末端往前指,迭代完成后指针指向列表前段,是一个空的对象。
>>> a = [20,10,30,40]
>>> c = reversed(a)
>>> c
<list_reverseiterator object at 0x0000000002BCCEB8>
>>> list(c)
[40, 30, 10, 20]
>>> 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
多维列表
层层嵌套。
二维列表帮助储存表格信息
print()与print(’\n’)
print()自带换行符,输出换一行
print(’\n’)先输出’\n’,再换行
元组
元组没有增加元素、修改元素和删除元素。
元组的访问和处理速度比列表快。
元组可以作为字典的键,而列表永远不能作为字典的键使用。
元组的创建
小括号创建
>>>a=(10,20,30)
>>>type(a)
<class 'tuple'>
>>>a=10,20,30
>>>type(a)
<class 'tuple'>
>>> a = (1)
>>> type(a)
<class 'int'>
>>> a = (1,) #或者 a = 1, >>> type(a)
<class 'tuple'>
tuple()创建元组
>>>b = tuple() #创建一个空元组对象
>>>b = tuple("abc")
>>>b = tuple(range(3))
>>>b = tuple([2,3,4])
元组的删除
del b#删除整个元组
元组的访问和计数
元组不能修改
用索引切片返回元组对象
>>> a = (20,10,30,9,8)
>>> a[1]
10
>>> a[1:3]
(10, 30)
>>> a[:4]
(20, 10, 30, 9)
sorted()
元组排序可用sorted(tupleObj),生成新的列表对象。
>>> a = (20,10,30,9,8)
>>> sorted(a)
[8, 9, 10, 20, 30]
zip
zip(列表 1,列表 2,…)将多个列表对应位置的元素组合成为元组,并返回这个 zip 对象。
>>> a = [10,20,30]
>>> b = [40,50,60]
>>> c = [70,80,90]
>>> d = zip(a,b,c)#返回zip对象
>>> list(d)#进一步包装为list对象
[(10, 40, 70), (20, 50, 80), (30, 60, 90)]
生成器推导式创建元组
生成器推导式生成的是生成器对象,可以通过生成器对象转换成列表或者元组,也可以使用生成器对象的__next__()方法进行遍历。
元素访问结束之后必须重新创建该生成器对象。
>>> s = (x*2 for x in range(5))
>>> s
<generator object <genexpr> at 0x0000000002BDEB48>
>>> tuple(s)
(0, 2, 4, 6, 8)
>>> list(s) #只能访问一次元素。第二次就为空了。需要再生成一次
[]
>>> s
<generator object <genexpr> at 0x0000000002BDEB48>
>>> tuple(s)
()
>>> s = (x*2 for x in range(5))
>>> s.__next__()
0
>>> s.__next__()
2
>>> s.__next__()
4