Python-元组列表
二者区别
- 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。
- 元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。
- list和tuple的内部实现都是array的形式,list因为可变,所以是一个over-allocate的array,tuple因为不可变,所以长度大小固定。数组存储的只是指针,指针所指的数据类型可能不一样,但指针的长度就是8个字节
定义
列表和元组都支持自定义的嵌套
l = [[1, 2, 3], [4, 5]] # 列表的每一个元素也是一个列表 tup = ((1, 2, 3), (4, 5, 6)) # 元组的每一个元素也是一个元组
id = [x for x in range(0, 100000)]
price = [x for x in range(200000, 300000)]
products = list(zip(id, price))
当然,两者也可以通过 list() 和 tuple() 函数相互转换:
list((1, 2, 3)) [1, 2, 3] tuple([1, 2, 3]) (1, 2, 3)
想创建一个空的列表,我们可以用下面的 A、B 两种方式,请问它们在效率上有什么区别吗?
# 创建空列表 # option A empty_list = list() # option B empty_list = []
区别主要在于list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高。
添加
append(元素值):在list末尾添加一个元素
insert(n, 元素值):在指定索引处添加元素
删除
pop(n):给定值n时就删除索引为n处的元素,没有的话就删除最后一个元素
del list[n]:直接删除给定的元素
list.remove(obj)
移除列表中某个值的第一个匹配项
修改
可以直接通过下标访问和修改单个元素
a[-1]表示列表的倒数第一个元素,也就是列表的最后一个元素
查询
也可以通过下标像上面那样进行元素访问
a[:],a[::]相当于a[0:n:1]:表示按照自动加1的方式访问索引从0到n-1的元素,元素个数为n,其实就是访问整个列表本身
这个有很多作用,例如
- 仅得到列表的奇数项元素用a[::2]
- 从第三个元素开始的奇数项元素a[2::2]
- 得到偶数项元素为a[1::2]
- 列表的倒序为a[::-1],相当于a[-1::-1],指从列表的最后一个元素倒序访问
[:]和=的区别
- 这两者都可以实现赋值,但是=是引用赋值,得到的列表指向的还是原来的内容,修改一个列表,另一个也会发生变化
- [:]是值赋值,修改新的或原来的列表,对另外一个列表没有影响
查询的操作同时适用于列表和元组
其他
l = [3, 2, 3, 7, 8, 1] l.count(3) 2 l.index(7) 3 l.reverse() l [1, 8, 7, 3, 2, 3] l.sort() l [1, 2, 3, 3, 7, 8] tup = (3, 2, 3, 7, 8, 1) tup.count(3) 2 tup.index(7) 3 list(reversed(tup)) [1, 8, 7, 3, 2, 3] sorted(tup) [1, 2, 3, 3, 7, 8]
- count(item) 表示统计列表 / 元组中 item 出现的次数。
- index(item) 表示返回列表 / 元组中 item 第一次出现的索引。
- list.reverse() 和 list.sort() 分别表示原地倒转列表和排序(注意,元组没有内置的这两个函数)。
- reversed() 和 sorted() 同样表示对列表 / 元组进行倒转和排序,reversed() 返回一个倒转后的迭代器(上文例子使用 list() 函数再将其转换为列表);sorted() 返回排好序的新列表。