文章目錄
0. 前言
- Python中基本數據結構介紹。
- 參考資料:
- 《深入理解Python特性》第5章
- 《流暢的Python》第2、3章
- 《Python Cookbook》第1章
1. 數組
- 包括list/tuple等。
- 有一些操作是所有序列都共有的。
- 如何選擇數組類型:
- 如果需要存儲任意對象,且其中可能含有混合數據類型,那應該選擇列表或元組。
- 如果存儲數值(整數或浮點數)數據,並要求數據排列緊密、注重性能,則應該使用 array.array。
- 強烈建議在初期使用通用數據格式,不要試圖在一開始就榨乾所有性能。
1.1. 序列
- 個人理解:本質就是數組,可以通過索引來獲取(部分類型可以修改)元素。
- 索引操作:
- 數組編號,可以爲負數,如-1就是最後一個元素。
- 分片:通過索引來訪問一定範圍內的元素,形如
[start:end:step]
- 索引範圍包括start,不包括end。
- 步長不能是0,但可以是負數。
- 如果start >= end(step爲正數)或start <= end(step爲負數),則返回空序列。
- 加法:相同類型序列相加就是拼接操作。
- 乘法:生成新序列,原來序列重複x次。
- 成員資格:
in
運算符,判斷是否存在某元素。 - 長度、最大/小值,對應
len
max
min
函數。
1.2. 列表
- 基本概念:
list
對象,可變序列。- 底層通過動態數組實現(應該就是類似ArrayList)。
- 不同數據類型可以混合存儲在一個列表中,但這回導致數據存儲不緊湊,佔據了更多的空間。
- 基本操作
- 新建列表:
list = []
- 賦值單個元素:
list[1] = value
- 刪除單個元素:
del list[1]
- 分片賦值:
list[:2] = list('ab')
- 新建列表:
- 列表方法
- 基本形式:
對象.方法(參數)
- append
- count
- extend
- index
- insert
- pop
- remove
- reverse
- sort
- 基本形式:
1.3. 元組
- 基本概念:
tuple
,不可變序列,定義時就固定了。- 不同數據類型可以保存在同一個元組中。
- 相比
list
所佔的空間更少
- 基本操作
- 定義:
- 直接通過都好分隔:
1, 2, 3
- 通過圓括號括起來:
(1, 2, 3)
- 一個值的元組:
1,
或(1,)
- 直接通過都好分隔:
- tuple函數:將序列轉換爲元組,
tuple([1, 2, 3])
- 索引、分片獲取。
- 定義:
- 元組的優勢
- 可以在映射中當作鍵使用,列表不行。
- 元組作爲很多內建函數、方法的返回值。
1.4. array.array
2. 字典
- 即
dict
類。 - 官方文檔:Mapping Types Dict
2.1. 字典的基本操作
- 創建字典對象
# 普通方法
map1 = {}
map2 = {1.23:"136", "age":18}
# dict方法
# 可以通過其他映射 或 key-value序列建立字典
key_values = [('name', 'emma'), ('age', 18)]
map3 = dict(key_values)
# 通過關鍵字創建
map4 = dict(name="emma", age=18)
- 操作操作
len(map) # key-value數量
map[key] # 獲取某個key對應的value
map[key] = value # 關聯key-value
del map[key] # 刪除鍵爲key的項
key in map # 檢查map中是否存在鍵key
- 其他概念
- 鍵類型:必須爲不可變類型(如字符串、整數、實數、元組)
- 自動添加:如果本來不存在的key,可以通過賦值直接創建
- 成員資格:
in
操作查找的是鍵,不是值。 - 遍歷字典:
# 好像建議不這麼用
for key in dict:
print(key, dict[key])
# 通過key遍歷
for key in dict.keys():
print(key, dict[key])
# 通過key-value對遍歷1
# 字典較小時效率較高
for key, value in dict.items():
print(key, value)
# 通過key-value對遍歷2
# 字典較大時效率較高
for (key, value) in dict.items():
print(key, value)
- 字典方法
- clear
- copy
- fromkeys
- get
- has_key
- items
- iteritems
- keys
- iterkeys
- pop
- popitem
- setdefault
- update
- values
- itervalues
2.2. 特殊的字典
- 特殊的字典一般都是
dict
的子類,有着幾乎相同的使用方式。 collections.OrderdDict
- 作用:記住key的插入順序,在遍歷時會按照循序遍歷。
- 在CPython3.6及更高版本中,標準字典實現
dict
也能暴露鍵的插入順序,但這只是CPython的一個附帶功能,到Python3.7才固定下來。 - 建議使用本功能時還是使用
OrderedDict
collections.defaultdict
- 作用:爲缺失的key返回默認值, 構造函數輸入的是一個
default_factory
,即一個構造器。 - 構造方法接受一個可調用對象(如
list
),如果查詢時key不存在,則返回這個可調用對象。 - 當然,設置默認值這個功能也可以通過
get()
方法實現,但通過這個類可以更清晰地表達意圖。 - 實例:
defaultdict(int), defaultdict(list)
int()
返回0。
- 作用:爲缺失的key返回默認值, 構造函數輸入的是一個
collections.ChainMap
- 作用:將多個字典組成一個映射,查詢時逐個查詢。
- 查詢操作時,會逐個查詢,但增刪改操作都是對第一個字典進行。
types.MappingProxyType
- 作用:只讀字典。
3. 集合
- 參考資料:
- 官方文檔:集合類型 - set, frozenset
- 《深入理解Python特性》5.4節
3.1. set
- 最基本的集合類型。
- 集合基本概念:
- 不含重複元素的無序對象。
- 由於是無序的,所以不支持索引、切片操作。
- 每個對象都是 hashable 的對象。
- 預計查詢時間複雜度爲O(1),交集、並集、子集、差集的時間複雜度爲O(n)。
- 新建:
{ele1, ele2, ...}
創建。set(list)
新建- 注意:空集只能通過
set()
而不能用dict
。
- 增刪操作
add()
:添加元素。remove()
:刪除元素,如果元素不存在會報錯。discard()
:刪除元素。pop()
:任意移除一個元素,如果是空集會報錯。clear()
:清空。
- 基本操作
len(s)
x in s
x not in s
- 集合操作
issubset(other)
或set <= other
或set < other
:s是否是other的子集。isdisjoint(other)
:兩個集合沒有公共元素則返回True。issuperset(other)
或set >= other
或set > other
:s是否是other的超集。union(*others)
或set | other | ...
:並集。intersection(*others)
或set & other
:交集。~~difference(*others)
或set - other - ...
:差集,存在於set但不存在於other。symmetric_difference(other)
或set ^ other
:只存在於set或other中,不能同時存在或同時不存在。
- 集合改操作,基本上就是一個集合操作加上
update
,是對原始集合的操作update(*others)
或set |= other | ...
:添加來自others的元素。intersection_update(*others
)或set &= other & ...
:只保留在others中也都存在的元素。symmetric_difference_update(other)
:只保留存在於其中一個集合的元素,不能同時存在或同時不存在。
3.2. frozenset
-
不可變集合。
-
與set操作幾乎完全相同,就是少了增刪改的相關操作。