列表用于存储任意数目、任意类型的数据集合
列表是内置可变序列,是包含多个元素的有序连续的内存空间。
列表的大小可变,根据需要随时增大或减小
列表常用方法
方法 | 要点 | 描述 |
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() | 浅拷贝 | 返回列表对象的浅拷贝 |
列表创建方法
range()创建整数列表(a = list(range(start, end, step)))
a = list(range(10)) # a = [0,1,2,3,4,5,6,7,8,9]
推导式生成列表
a = [x*3 for x in range(5)] # a = [0,3,6,9,12]
# 使用if过滤元素
b = [x*2 for x in range(100) if x%9==0]
# b = [0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
当列表增加和删除元素时,列表会自动进行内存管理,大大减少程序员的负担,但这个特点设计列表元素的大量移动,效率较低。除非必要,一般只在列表尾部添加元素或删除元素,这样会=可以大大提高列表的操作效率。
append()方法
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快。
+运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象,将源列表的元素和新列表的元素一次复制到新的列表对象中,这样会涉及大量的复制操作,对于操作大量元素不建议使用。
extend()方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
insert()方法
使用insert()方法可以将指定的元素插入到列表对象的任意制定位置。这样会让插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用。类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。
乘法扩展
使用乘法扩展列表,生成一个新列表,新列表元素是原列表元素的多次重复
列表元素的删除(删除元素的底层还是元素的拷贝)
del。删除列表指定位置的元素
pop()。删除并返回指定元素,如果未指定位置则默认操作列表最后一个元素
remove()。删除首次出现的指定元素,若不存在该元素则抛出异常
列表切片
[:] 提取整个列表
[start:]从start索引开始到结尾
[:end]从头开始知道end-1
[start:end]从start到end-1
[start:end:step]从start提取到end-1,步长是step
切片操作时,起始偏移量和终止偏移量不在 [0,字符串长度-1] 这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成”长度-1”。
列表遍历
a = [10,20,30,40]
for item in a:
print(item)
复制列表所有的元素到新的列表对象
list1 = [10,20,60]
list2 = list1
上述操作只是将list2也指向了列表对象,即list1和list2的地址值是相同的,列表本身的元素并没有复制。
list1 = [30,40,50]
list2 = [] + list1 #生成了新列表对象
列表排序
# 修改原列表,不建新列表的排序
a = [20,10,30,40]
id(a) #46017416
a.sort() #默认是升序排列 [10, 20, 30, 40]
a = [10,20,30,40]
a.sort(reverse=True) #降序排列 [40, 30, 20, 10]
import random
random.shuffle(a) #打乱顺序 [20, 40, 30, 10]
# 建新列表的排序
# sorted()方法返回新的列表,不对原列表做修改
a = [20,10,30,40]
id(a) # 46016008
b = sorted(a) #默认升序 b = [10, 20, 30, 40]
id(b) # 45907848
c = sorted(a,reverse=True) #降序 [40, 30, 20, 10]
"""
内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。
"""
a = [20,10,30,40]
c = reversed(a) # <list_reverseiterator object at 0x0000000002BCCEB8>
list(c) # [40, 30, 10, 20]
list(c) # []
# 两次结果不一样,因为迭代器对象在第一次时已经遍历结束了,第二次不能再使用