1 概述
- Python的數據結構主要分爲:列表(list)、數組(array)、元組(tuple)、集合(set)和字典(dict)
- 通常情況下這些都是基礎知識,也有一些騷操作和黑科技,比較有意思
2 列表(list)
- 一種可以容納不同數據類型元素的數組
2.1 列表的創建
a = [] # 這就創建了一個空列表
- 列表中可以包含數字、字符串等,還可以包含其他列表
2.2 列表索引
分爲正向索引和負向索引,這個經常用到,所以重視
b[0]
b[1] # 這樣是正向索引
c[-1] # 這樣是選中c中的最後一個元素
c[-2][0] # 這種情況一般出現在C列表中包含列表的情況,
# c[-2]代表c的倒數第二個元素,其本身是一個列表,
# c[-2][0]即代表c倒數第二個元素中的第一個元素。
# 例如:
c = [1, 12.4, "This is fantastic!", 23]
print(c[-2][0])
# 輸出“T”
- 注意這裏的字符串是一個字符數組,其也可以進行索引
2.3 列表的切片(重點)
a[1:5]
選擇a列表中的a[1]~a[4]5個元素b[:2]
選擇b中前兩個元素(即b[0], b[1]
)b[2:]
選擇b中後兩個元素(即b[-2], b[-1]
)c[1::2]
選擇c中索引爲奇數的元素c[0::2]
選擇c中索引爲偶數的元素
2.3.1 注意
- 中括號中的參數,用冒號分隔。第一個參數是起始位置,最後一個參數是結束位置
- 列表切片實行“左閉右開”原則,即得到的切片包含起始元素,但是不包含結束元素
- 第4、5條中,其實是省略了中間的結束元素,增加了第二個冒號後的第三元素,這個元素的意思是步長,即每隔2個數,切一次。默認步長爲1.
- 參數中,起始如果是0可以省略;結束如果是最後,也可以省略;步長如果是1,可以省略。
- 切片後的列表和源列表是不同的列表,不會相互影響。
2.3.2 列表的複製和反轉
- 如果直接用賦值表達式進行復制,如:
>>> a = ["I", "love", "Python"]
>>> b = a
# a的引用複製給b,在內存中其實是指向了用一個對象
>>> b is a
True
>>> id(a)
46381384
>>> id(b)
46381384
------
# 參考:【Python 中的比較:is 與 ==】https://www.cnblogs.com/kiko0o0/p/8135184.html
- 可以發現b和a的內存地址是相同的,它們指向同一塊內存,因而 is 和 == 的結果都爲True。
- 這樣如果改變b中的值,a的值也會隨之改變
- 但是如果利用切片進行復制就不會出現這種情況:
>>> b = [1,2,3,4]
>>> a = b[:]
>>> a is b
False
>>> a == b
True
>>> id(a), id(b)
(1936921175624, 1936921176648)
- 這裏注意一下,python的節省內存的方式是非常牛逼的,比如,在我創建完上面a,b兩個列表之後:
>>> a[0] is b[0] # 值未改變的時候,元素中的內存是相同的
True
>>> a[0] = 10
>>> a[0] is b[0] # 值改變之後,就會新建一個內存
False
- 言歸正傳:
- 複製:
a = b[:]
,其實還有一個方法:a = b.copy()
- 翻轉:
a = b[::-1]
2.4 列表的元素動態添加
2.4.1 append 在末尾添加元素
>>> a
[10, 2, 3, 4]
>>> a.append(5)
>>> a
[10, 2, 3, 4, 5]
2.4.2 extend 一次性添加多個元素
>>> a,b
([10, 2, 3, 4, 5], [1, 2, 3, 4])
>>> a.extend(b) # 將b中的元素加入到a的末尾
>>> a
[10, 2, 3, 4, 5, 1, 2, 3, 4]
>>> a.append(b) # 直接將b這個列表加入a的末尾
>>> a
[10, 2, 3, 4, 5, 1, 2, 3, 4, [1, 2, 3, 4]]
2.4.3 insert 插入
>>> b
[1, 2, 3, 4]
>>> b.insert(1, '1')
>>> b
[1, '1', 2, 3, 4]
2.5 列表的元素動態刪除
2.5.1 clear 清空列表
- 這個方法和
a = []
等價
>>> a,d
([10, 2, 3, 4, 5, 1, 2, 3, 4, [1, '1', 2, 3, 4]], [10, 2, 3, 4, 5, 1, 2, 3, 4, [1, '1', 2, 3, 4]])
>>> a.clear()
>>> d = []
>>> a,d
([], [])
2.5.2 pop 將列表的最後元素刪除,並作爲返回值返回
>>> b
[1, '1', 2, 3, 4]
>>> b.pop()
4
>>> b
[1, '1', 2, 3]
2.5.3 remove 去除某個元素(第一次出現)
>>> a = [1,2,3,2,5]
>>> a.remove(2)
>>> a
[1, 3, 2, 5]
>>> a.remove(2)
>>> a
[1, 3, 5]
2.6 列表元素的原地複製和翻轉
2.6.1 複製list.copy
- 在2.3.2小節提到過,對於列表的複製,可以直接用切片
b = a[:]
複製,也可以使用a.copy
進行復制
>>> a = [1,2,3,4]
>>> b = a[:]
>>> c = a.copy()
>>> b,c
([1, 2, 3, 4], [1, 2, 3, 4])
2.6.2 原地翻轉list.reverse
- 對於列表的翻轉,在2.3.2小節提到的使用切片
d = a[::-1]
進行翻轉。但是這種翻轉是不會影響到a本身的值的。 - 使用原地翻轉
a.reverse
可以實現對列表a本身的翻轉。
>>> a
[1, 2, 3, 4]
>>> a.reverse()
>>> a
[4, 3, 2, 1]
3 數組(array)
- 僅支持一種數據類型的數組,其效率比列表要快,如果數組中僅有數字或字符串,建議使用這種數據結構。
- array數組具有和list列表的很多相同的方法,這裏不再贅述
- 【注意】使用數組時需要先引入array庫
>>> from array import array
>>> array_a = array('i', a)
>>> array_a
array('i', [4, 3, 2, 1])
>>> import sys
>>> sys.getsizeof(a), sys.getsizeof(array_a) # 獲取所佔內存的大小
(96, 80)
4 元組(tuple)
- 元素不可變的列表,使用
()
包含元素 - 但是如果元組中嵌套了列表,可以改變列表中的內容,如:
>>> c = (1,2,3,4,a)
>>> c
(1, 2, 3, 4, [4, 3, 2, 1])
>>> c[4][0] = 1
>>> c
(1, 2, 3, 4, [1, 3, 2, 1])
5 集合(set)
- 無重複元素的列表,使用
{}
包含元素 - 相比於列表,集合查詢元素的速度更快,更容易實現數學上對集合定義的交併補差等操作
>>> a = {'123', '456', '123'}
>>> a
{'123', '456'}
6 字典(dict)
- 擁有鍵(key)值(value)對的一種數據結構
- 在默認情況下會查找鍵而不會查找值,除非顯式調用
values()
方法 - 索引也是對於鍵的索引,而不是在字典中的位置。
>>> d
{1: 'a', 2: 'b', 'c': 3}
>>> 'a' in d
False
>>> 'a' in d.values()
True
>>> d[1]
'a'
>>> d['c']
3