列表在Python中是一个任意类型对象位置的相关有序集合,它没有固定大小,根据数据量的不同可以动态变化。可以对列表中的数据进行赋值、修改、添加、删除等操作,可以对列表进行索引、切片、分割等操作。
在Python中创建一个列表时,解释器会在内存中创建一个堆栈自下而上堆放数据项,类似于其他编程语言中的数组。
列表可以从左向右进行索引,索引号默认从’0’开始,列表也可以从右向左进行索引,最右侧索引号尾’-1’,不要忘记’-‘,这表明了列表的索引方向
lists = ["m1", 1900, "m2", 2000, "m3", 2100]
print(lists[1])
print(lists[-2])
运行结果:
1900
m3
列表的内存利用
当创建N个元素的List时,Python的动态内存分配长N+1个元素的内存,第一个元素存储列表长度,和列表的元信息。
当append一个元素时,Python将创建一个足够大的列表,来容纳原有的N个元素和将要被追加的元素。重新创建的列表长度大于N+1(虽然我们只触发一次append操作),实际上,为了未来的append操作,M个元素长度(M>N+1)的内存将会被额外分配,然后,旧列表中的数据被copy到新列表中,旧列表销毁。
注:额外内存的分配只会发生在第一次append操作时,当我们创建普通列表时,不会额外分配内存。(一个append操作很可能是很多append操作的开始,通过额外分配内存来减少可能的内存分配和内存copy的次数)
列表的基本操作
定义列表
lists = ["m1", 1900, "m2", 2000, "m3", 2100]
1 列表无类型标识符
2 不同类型元素可以同时出现在列表中,列表中的元素可以是数,字符串,元组,甚至是列表
3 列表以[]作为开始和结束
4 列表结束后没有;
5 列表属于序列数据结构
6 列表是可变数据对象
注:元组一旦定义完成,其中的元素不能作任何修改,也不能添加,而列表是可以更改的
7 列表并不真正存放数据,而是存放对象引用
打印列表
lists = ["m1", ["m1", 1900, "m2"], "m2", 2000, "m3", 2100]
print(lists)
print(lists[1])
print(lists[1][1])
运行结果:
['m1', ['m1', 1900, 'm2'], 'm2', 2000, 'm3', 2100]
['m1', 1900, 'm2']
1900
添加操作
* 在列表末尾追加数据项
lists.append("m4")
print(lists)
* 在列表指定位置添加数据项
insert 方法将一个对象插入到现有列表中指定索引值的前面
lists = ["m1", 1900, "m2", 2000, "m3", 2100]
lists.insert(0, 1800)
print(lists)
运行结果:
[1800, 'm1', 1900, 'm2', 2000, 'm3', 2100]
* 在列表末尾追加数据列表
extend方法接收第二个列表,将其中的各个对象增加到现有列表
lists = ["m1", 1900, "m2", 2000, "m3", 2100]
appe = ["m4", 2200, "m5", 2300]
lists.extend(appe)
print(lists)
lists.extend(["m4", 2200, "m5", 2300])
print(lists)
运行结果:
['m1', 1900, 'm2', 2000, 'm3', 2100, 'm4', 2200, 'm5', 2300]
['m1', 1900, 'm2', 2000, 'm3', 2100, 'm4', 2200, 'm5', 2300, 'm4', 2200, 'm5', 2300]
删除操作
* 删除指定索引的数据项
1 pop()根据对象的索引值从现有列表删除并返回该对象
2 如果列表为空或删除一个不存在的元素会报错IndexError
注:如果调用pop时没有指定索引值,将删除和返回列表中的最后一个对象
lists = ['m1', 1900, "m2", 2000, "m1"]
lists.pop(2)
print(lists)
运行结果:
['m1', 1900, 2000, 'm1']
* 删除指定数据项
1 若有多项匹配该指定数据项值 仅删除其中第一项(同时列表的大小减一)
2 若不存在该值 报错ValueError
lists = ["m1", 1900, "m2", 2000, "m3", 2100, "m4", 2200, "m4"]
lists.remove("m4")
print(lists)
运行结果:
['m1', 1900, 'm2', 2000, 'm3', 2100, 2200, 'm4', 2300, 'm4', 2400, 'm4']
查询操作
* 查询指定数据项出现次数
如果改元素不存在,那么返回0
lists = ['m1', 1900, "m2", 2000, "m1"]
print(lists.count('m1'))
运行结果:
2
* 查询指定数据项的索引值
1 若有多项匹配该指定数据项值 仅返回第一项的索引值
2 若不存在该值 报错ValueError
lists = ['m1', 1900, "m2", 2000, "m1"]
print(lists.index('m1'))
其它操作
* 获取列表长度
若访问列表项越界,会报IndexError错误
print(len(lists))
* 反转列表
lists = ['m1', 1900, "m2", 2000, "m1"]
lists.reverse()
print(lists)
运行结果:
['m1', 2000, 'm2', 1900, 'm1']
* 列表排序
list.sort()排序时,列表内的数据项必须为同类型,默认升序排序
list.sort(reverse=True) 表示降序排列
lists = [['m1'], ["m2"], ["m1"]]
lists.sort()
print(lists)
lists = [1, 3, 2]
lists.sort()
print(lists)
lists.sort(reverse=True)
print(lists)
运行结果:
[['m1'], ['m1'], ['m2']]
[1, 2, 3]
[3, 2, 1]
* 查找最大/最小数据项
lists = [['m1', 'm3'], ['m1', "m2"], ['m2', "m1"]]
print(max(lists))
print(min(lists))
运行结果:
['m2', 'm1']
['m1', 'm2']
* 打印数据项对应的下标
lists = [['m1', 'm3', 'm3'], 1900, 'happy']
for i, val in enumerate(lists):
print(i, val)
运行结果:
0 ['m1', 'm3', 'm3']
1 1900
2 happy
列表切片
Python中符合序列的有序序列都支持切片,如列表,字符串,元组。
格式:[start:end:step]
l start:表示起始索引,从0开始,-1表示结束;若缺省起始索引,表示从头开始取
l end:表示结束索引,但不包含结束索引;若缺省结束索引,则表示取到末尾
l step:表示步长。步长为正时,从左向右取值;步长为负时,反向取值
注:如果起始索引和结束索引全部缺省,则取全部
lists = [['m1', 'm3', 'm3'], 1900, 'happy', 2000,'sad', 2001]
print(lists[1:3])
print(lists[:3])
print(lists[2:])
print(lists[:])
print(lists[1:4:2])
print(lists[4:1:-2])
运行结果:
[1900, 'happy']
[['m1', 'm3', 'm3'], 1900, 'happy']
['happy', 2000, 'sad', 2001]
[['m1', 'm3', 'm3'], 1900, 'happy', 2000, 'sad', 2001]
[1900, 2000]
['sad', 'happy']
复制列表
* 浅拷贝
方法一:
sample = ['m1', 'm3', 'm3']
lists = [sample, 1900, 2001]
listscopy = lists.copy()
print(listscopy)
sample[0] = 'm0'
print(listscopy)
运行结果:
[['m1', 'm3', 'm3'], 1900, 2001]
[['m0', 'm3', 'm3'], 1900, 2001]
方法二:
import copy
sample = ['m1', 'm3', 'm3']
lists = [sample, 1900, 2001]
listcopy = copy.copy(lists)
print(listcopy)
sample[0] = 'm0'
print(listcopy)
运行结果:
[['m1', 'm3', 'm3'], 1900, 2001]
[['m0', 'm3', 'm3'], 1900, 2001]
* 深拷贝
innerobject = ['b1', 'b2']
sample = [innerobject, 'm3', 'm3']
lists = [sample, 1900, 2001]
listcopy = copy.deepcopy(lists)
print(listcopy)
innerobject[0] = 'm0'
print(listcopy)
运行结果:
[['m1', 'm3', 'm3'], 1900, 2001]
[['m1', 'm3', 'm3'], 1900, 2001]
遍历列表