python 基礎知識梳理——列表和元組
阿新 • • 發佈:2021-01-24
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.如果儲存的資料或者數量是可變的,要進行增加、刪除和修改的話,列表更合適。
博文的後續更新,請關注我的個人部落格:星塵部落格