《Python核心程式設計》(第二版) 第7章 映像和集合型別
第7章 映像和集合型別
7.1 對映型別:字典
(1)字典是Python語言中唯一的對映型別。對映型別中雜湊值(Key)和指像物件(Value)是一對多的關係。
(2)對映型別通常被稱為雜湊表。
(3)一個字典條目的語法格式是鍵-值對,多條字典條目被包含在大括號({})中。
7.1.1 如何建立字典和給字典賦值
除賦值操作建立字典外,可通過fromkeys()建立“預設”字典。
>>>ddict = {}.fromkeys(('x', 'y'), -1)
>>>ddict
{'y': -1, 'x': -1}
7.1.2 如何訪問字典中的值
7.1.3 如何更新字典
7.1.4 如何刪除字典
7.2 對映型別操作符
字典可以和所有的標準型別操作符一起工作,但卻不支援像拼接和重複等操作。
7.2.1 標準型別操作符
7.2.2 對映型別操作符
(1)字典的鍵查詢操作符
(2)(鍵)成員關係操作(in、not in)
7.3 對映型別的內建函式和工廠函式
7.3.1 標準型別函式【type()、str()和cmp()】
1.字典的cmp()演算法規則:
(1)比較字典長度,鍵的個數越多,字典越大。
(2)比較字典的鍵:字典中相同的鍵會對映到雜湊表的同一個位置,保證了字典檢查的一致性。當2個鍵不相同時,直接對鍵進行比較。
(3)比較字典的值:兩個字典的長度和鍵完全相同,則對值進行比較。
(4)完全匹配:字典的長度、鍵、值完全相同,則字典相等。
7.3.2 對映型別相關的函式
1.dict()
(1)用於建立字典,如不提供引數則生成空字典。
(2)引數是可迭代的,即是一個序列,或者是一個迭代器,或者為可迭代物件。
2. len()
返回所有元素(鍵-值對)的數目
3.hash()
判斷物件是否為可以作為字典的鍵,將物件傳遞給hash(),返回該物件的雜湊值,只有該物件為可雜湊的(不可雜湊則返回錯誤),才可作為字典的鍵。
7.4 對映型別內建方法
1.dict.clear():刪除字典中的所有元素
2.dict.copy():返回字典(淺複製)的一個副本
3.dict.fromkeys(seq, val = None):建立並返回一個新字典,以seq中的元素做該字典的鍵,val做該字典中所有鍵對應的初始值(如不提供此值,則預設為None)
4.dict.get(key, default = None):返回字典中key對應的值,如字典中不存在此鍵,則返回default的值。
5.dict.has_key(key):如果字典中存在鍵則返回True,否則返回False,可用in和not in代替之。
6.dict.items():返回一個包含字典中鍵-值對之元組列表。
7.dict.keys():返回一個包含字典中鍵的列表。
8.dict.pop(key, default):如果字典中key存在,刪除並返回dict[key],如果不存在,則返回default值(未提供default值會產生異常)。
9.dict.setdefault(key, default = None):類似set(),如果字典中不存在key,則有dict[key] = default為之賦值。
10.dict.update(dict2):將字典dict2的值鍵對新增到字典dict中。
11.dict.values():返回一個包含字典中所有值的列表。
7.5 字典的鍵
7.5.1 不允許一個鍵對應多個值
賦值會把原值替換掉
7.5.2 鍵必須是可雜湊的
所有不可變型別都是可雜湊的,可雜湊的鍵是不可更改的。
7.6 集合型別
數學上,把set稱為由不同元素組成的集合,集合分為可變集合(set)和不可變集合(frozenset)。可變集合是不可雜湊的。
7.6.1 如何建立集合型別和給集合賦值
集合被建立的方法:set()和frozenset()
>>>s = set('china')
>>>s
set(['c', 'h', 'i', 'n', 'a'])
>>>t = frozenset('lei')
>>>t
frozenset(['c', 'h', 'i', 'n', 'a'])
7.6.2 如何訪問集合中的值
可遍歷檢視元素是否為集合中的成員:
>>>'c' in s
True
>>>for i in s:
... print i
c
h
i
n
a
7.6.3 如何更新集合
用各種集合內建的方法和操作符新增和刪除集合的成員。
7.6.4 如何刪除集合中的成員和集合
7.7 集合型別操作符
7.7.1 標準型別操作符(所有的集合型別)
1.成員關係(in, not in)
2.集合等價/不等價:兩個集合相等是指,對每個集合而言,當且僅當其中一個集合中的每個成員同時也是另一個集合中的成員。
3.子集/超集:“小於”符號(<, <=)用來判斷子集,“大於”符號(>, =)用來判斷超集。
7.7.2 集合型別操作符(所有的集合型別)
1.聯合(|):兩個集合的聯合是一個新集合,該集合的每個元素都至少是其中一個集合的成員。等價於union()。
>>>s = set('lei')
>>>t = frozenset('cheng')
>>>s | t
set( ['l', 'e', 'i', 'c', 'h', 'n', 'g'] )
2.交集(&):交集形成的新集合中的每個元素同時是兩個集合中的成員
>>>s&t
set( ['e'] )
3.差補/相對補集(-):s和t的差補形成的新集合中的元素只屬於s,而不屬於t。等價於difference()。
>>>s-t
set( ['l', 'i'] )
4.對稱差分(^):s和t的對稱差分是一個新集合,該集合中的元素只能屬於集合s或集合t,不能同時屬於兩個集合。
>>>s^t
set( ['l', 'i', 'c', 'h', 'n', 'g'] )
5.混合集合型別操作
(1)上示例中,左邊s是可變集合,右邊t是不可變集合,使用集合操作符後產生的依然是可變集合。但如左右順序反過來則會生成不可變集合。
(2)集合型別操作結果與左運算元的型別相同。
7.7.3 集合型別操作符
1.(Union)Update(|=):從已存在的集合中新增*(可能多個)成員,與update()等價。
2.Retention/Intersection Update(&=):保留(或交集更新)操作保留與其它集合的共有成員,與intersection_update()等價。
3.Difference Update(-=):s-=t 返回一個新集合,該集合中的成員是集合s去除掉集合t中的元素後剩餘的元素。
4.Symmetric Difference Update(^=):差分更新操作:s^=t 返回的集合中的成員僅是原集合s或僅是另一集合t中的成員。
7.8 內建函式
7.8.1 標準型別函式
len()返回集合元素個數。
7.8.2 集合型別工廠函式
set()和frozenset()
7.9 集合型別內建方法
7.9.1 方法(所有集合型別)
(1) s.issubset(t)
(2) s.isupperset(t)
(3) s.union(t)
(4) s.intersection(t)交集
(5) s.difference(t) 僅為s成員
(6) s.symmetric_difference(t) 非s和t共有成員
(7) s.copy()
7.9.2 方法(僅適用於可變集合)
1. s.update(t)
2.s.intersection_update(t):交集
3.s.difference_update(t):僅為s元素
4.s.symmetric_difference_update(t):非s和t共有元素
5.s.add(obj)
6.s.remove(obj)
7.s.discard(obj):如果obj是s中的元素,則從s中刪除obj。
8.s.pop()
9.s.clear()
7.9.3 操作符和內建方法比較
7.10 集合型別總結表
7.11 相關模組
7.12 練習