Python基礎(10) 序列(tuple/list)、字典(dict)、集合(set)


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. 字典

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。
  • collections.ChainMap
    • 作用:將多個字典組成一個映射,查詢時逐個查詢。
    • 查詢操作時,會逐個查詢,但增刪改操作都是對第一個字典進行。
  • types.MappingProxyType
    • 作用:只讀字典。

3. 集合

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 <= otherset < other:s是否是other的子集。
    • isdisjoint(other):兩個集合沒有公共元素則返回True。
    • issuperset(other)set >= otherset > 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操作幾乎完全相同,就是少了增刪改的相關操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章