1. 程式人生 > >《Python核心程式設計》(第二版) 第7章 映像和集合型別

《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 練習