python 基础知识梳理——列表和元组

python 基础知识梳理——列表和元组

列表和元组

列表list和元组tuple都是可以一个可以用来放置任意数据类型的有序集合

list1 = [1,2,'hello','world']# 列表中含有int类型和string类型的元素
print(list1)
[1,2,'hello','world']
tuple1 = ('json',2) # 元组中含有int类型和string类型的元素
ptrint(tuple1)
('json',2)

区别:
列表是动态的,长度大小不固定,可以随时的增加、删除或者改变元素
元组是静态的,长度大小固定,无法增加、删除或者改变元素

list1 = [1,2,3,4]
list[3] = 4 # Python中从0开始索引,list[3]表示第四个元素

tuple1 = (1,2,3,4,5)
tuple1(3) = 4 # 类似于list
tuple1[3]=40 # 语句错误!tuple中的元素无法更改

如果想要对元组进行修改,就只能重新开辟一块内存,创建新的元组。

tuple1 = (1,2,3,4)
new_tuple = tuple1 + (5,)# 创建新的元组并添加5到新元组的末尾

list1 = [1,2,3,4]
l.append(5) # 添加元素5到列表的末尾
print(list1)
[1,2,3,4,5]

通过-1,-2等操作可以从后定位单个元素

list1 = [1,2,3,4]
print(list1[-1])
4

tuple1 = (1,2,3,4)
print(tuple1[-1])
4

除了基本的初始化和索引外,所有的列表和元组都支持切片操作

list1 = [1,2,3,4]
list1[1:2]# 返回列表中索引从 2 到 3 的子列表
[2,3]

tuple1 = (1,2,3,4)
tuple1[2:3] # 返回元组中索引从 3 到 4 的子元组
(3,4)

元组和列表也可以随便嵌套

list((1,2,3))
[1,2,3]

tuple([1,2,3])
(1,2,3)

列表和元组有很多内置元素:

list1 = [1,2,3,4,5,6,7,8]
list1.count(3) # 统计元素出现的次数
1
list1.index(3)# 返回索引元素的位置
2
list1.sort()# 正向排序,可以通过revered=True来调整排序后的顺序
[1,2,3,4,5,6,7,8]

tuple1 = (3,2,3,7,8,1)
tuple1.count(3)# 统计元素出现的次数
2
tuple1.index(7)# 返回索引元素的位置
3
list(reversed(tuple1))# 倒转元组,返回倒转后的新元组
[1,8,7,3,2,3]
sorted(tuple1)# 对元组排序,返回排序后的新元组
[1,2,3,3,7,8]

元组和列表存储方式的差异

元组和列表最重要的差别是,列表式动态的、可变的,而元组是动态的、不可变的,这样的差异会导致这两者的存储方式的差异。

list1 = [1,2,3]
list1.__sizeof__()
64

tuple1 = (1,2,3)
tuple1.__sizeof__()
48

相对于列表,元组所占用的空间却少16个字节,事实上,由于列表是动态的,所以它需要存储指针,用来指向对应的元素(上述例子中,int型占用8个字节),另外,由于列表可变,所以需要额外存储已经分配的长度大小(8个字节),这样才能实时追踪列表空间的使用情况,当空间不足的时候,动态的分配额外的空间。

list1 = []
list1.__sizeof__()# 空列表的存储空间为40个字节
40
list1.append(1)
list1.__sizeof__()# 当加入了元素1之后,列表为其分配了可以存储4个元素的空间(72-40)/8=4
72
list1.append(2)
list1.__sizeof__()# 由于之前分配的空间,所以加入元素后,列表的空间不变
72
list1.append(3)
list1.__sizeof__()# 由于之前分配的空间,所以加入元素后,列表的空间不变
72
list1.append(4)
list1.__sizeof__()# 由于之前分配的空间不够了,所以加入元素后,列表的空间又增加了4个元素空间,72+4x8=104
104

列表在增加、删除的时间复杂度为O(1)

列表和元组的性能

通过对比列表和元组存储方式的差异可以看出,元组比列表要更轻量级一些,所以总体上来说,元组的性能要由于列表。

另外,在Python后台,对静态数据绘做一些资源缓存

下面,我们可以查看Python中列表和元组的初始化速度,可以看到,元组的初始化速度比列表快5倍。

python3 -m timeit 'x=(1,2,3,4,5,6)'
20000000 loops, best of 5: 9.97 nsec per loop
python3 -m timeit 'x=[1,2,3,4,5,6]'
5000000 loops, best of 5: 50.1 nsec per loop

如果是索引操作的话,两者的速度差别非常小,可以忽略不计。

python3 -m timeit -s 'x=[1,2,3,4,5,6]' 'y=x[3]'
10000000 loops, best of 5: 22.2 nsec per loop
python3 -m timeit -s 'x=(1,2,3,4,5,6)' 'y=x[3]'
10000000 loops, best of 5: 21.9 nsec per loop

如果是要增加、删除或者修改元素的话,列表更具优越性。

列表和元组的使用场景

1.如果存储的数据和数量不变,一般来说类似于json数据直接传给前端渲染,那么选用元组肯定更合适。

2.如果存储的数据或者数量是可变的,要进行增加、删除和修改的话,列表更合适。





博文的后续更新,请关注我的个人博客:星尘博客

猜你喜欢

转载自blog.csdn.net/u011130655/article/details/113018861
今日推荐