映射類型
定義:鍵值對(duì),鍵不能重復(fù),值可以重復(fù)。Python中的映射類型是字典(dict)
映射的創(chuàng)建
1. 字面值創(chuàng)建
eg. d = {'a' : 100, 'b':200 }
2. 工廠函數(shù)dict()創(chuàng)建
eg1. d = dict([['x', 1], ['y':2]])
eg2. d = dict(x=1, y=2)
eg3. d = dict( zip(('x', 'y'), (1,2)) )
3. 其他函數(shù)
d = dict.fromkeys( (1,2,3), 'value' ) #創(chuàng)建一個(gè)dict,鍵為1,2,3,值為value
映射的使用
1. 鍵值讀寫
[]操作符:
可以用來(lái)獲得值或者設(shè)置/新建值
在讀取的時(shí)候,如果鍵不存在,則拋出一個(gè)錯(cuò)誤
eg.
a = {'x':1, 'y':2}
a['z'] = 3 #鍵不存在,則創(chuàng)建鍵值對(duì)
a['x'] = '6' #鍵存在,則更新值
a['y'] #獲得鍵對(duì)應(yīng)的值
#! a['p'] 沒有對(duì)應(yīng)的鍵會(huì)拋出Error!
get(key, default=None)
用來(lái)獲取值時(shí),如果鍵不存在也不會(huì)拋出錯(cuò)誤,會(huì)返回default值
NOTE: 沒有set方法
2. 遍歷:
keys --> 鍵遍歷
values --> 值遍歷
items --> 鍵值遍歷
利用sorted(dict) --> 有序的鍵遍歷(對(duì)鍵排序)
eg. TestTraversal.py
3. 常用操作
刪除
del a['x'] #刪除鍵為'x'的條目
a.clear #清除字典
a.pop('x') #刪除鍵為'x'的條目并返回其值
a.popitem() #彈出一個(gè)(k,v)對(duì)并返回。如果a為空則報(bào)錯(cuò)
判斷
k in/not in dict
4. 常用函數(shù)表
方法名字 操作
dict.clear() 刪除字典中所有元素
dict.copy() 返回字典(淺復(fù)制)的一個(gè)副本
dict.fromkeysc(seq,
val=None) 創(chuàng)建并返回一個(gè)新字典,以seq 中的元素做該字典的鍵,val 做該字典
中所有鍵對(duì)應(yīng)的初始值(如果不提供此值,則默認(rèn)為None)
dict.get(key,
default=None) 對(duì)字典dict 中的鍵key,返回它對(duì)應(yīng)的值value,如果字典中不存在此
鍵,則返回default 的值(注意,參數(shù)default 的默認(rèn)值為None)
dict.has_key(key) 如果鍵(key)在字典中存在,返回True,否則返回False.
在Python2.2版本引入in 和not in 后,此方法幾乎已廢棄不用了,但
仍提供一個(gè)可工作的接口。
dict.items() 返回一個(gè)包含字典中(鍵, 值)對(duì)元組的列表
dict.keys() 返回一個(gè)包含字典中鍵的列表
dict.iter() 方法iteritems(), iterkeys(), itervalues()與它們對(duì)應(yīng)的非迭代方法
一樣,不同的是它們返回一個(gè)迭代子,而不是一個(gè)列表。
dict.pop(key
[, default]) 和方法get()相似,如果字典中key 鍵存在,刪除并返回dict[key],如果
key 鍵不存在,且沒有給出default 的值,引發(fā)KeyError 異常。
dict.setdefault(key,
default=None) 和方法set()相似,如果字典中不存在key 鍵,由dict[key]=default為它賦值。
dict.update(dict2) 將字典dict2 的鍵-值對(duì)添加到字典dict
dict.values() 返回一個(gè)包含字典中所有值的列表
映射的鍵
什么可以做為映射的鍵? --> 可hash的
什么可hash?
1. 不可變對(duì)象 (數(shù)字,字符串。。。)
2. 僅包含不可變對(duì)象的不可變?nèi)萜鳎▋H包含不可變對(duì)象的元組)
3. 實(shí)現(xiàn)了__hash__()方法的類(可能是可變對(duì)象)
集合類型(Set)
特點(diǎn):無(wú)順序,不能重復(fù)
分類:可修改的集合和不可修改的集合
創(chuàng)建:
>>> s = set('cheeseshop')
>>> s
set(['c', 'e', 'h', 'o', 'p', 's'])
>>> t = frozenset('bookshop')
>>> t
frozenset(['b', 'h', 'k', 'o', 'p', 's'])
使用:
>>> 'k' in s
False
>>> 'k' in t
True
>>> 'c' not in t
True
>>> for i in s:
... print i
操作
函數(shù)/方法名 等價(jià)運(yùn)算符 說明
所有集合類型
len(s) 集合基數(shù): 集合s 中元素的個(gè)數(shù)
set([obj]) 可變集合工廠函數(shù); obj 必須是支持迭代的,由obj 中
的元素創(chuàng)建集合,否則創(chuàng)建一個(gè)空集合
frozenset([obj]) 不可變集合工廠函數(shù); 執(zhí)行方式和set()方法相同,但它
返回的是不可變集合
obj in s 成員測(cè)試:obj 是s 中的一個(gè)元素嗎?
obj not in s 非成員測(cè)試:obj 不是s 中的一個(gè)元素嗎?
s == t 等價(jià)測(cè)試: 測(cè)試s 和t 是否具有相同的元素?
s != t 不等價(jià)測(cè)試: 與==相反
s < t (嚴(yán)格意義上)子集測(cè)試; s != t 而且s 中 所 有的元素都是t 的成員
s.issubset(t) s <= t 子集測(cè)試(允許不嚴(yán)格意義上的子集): s 中所有的元素 都是t 的成員
s > t (嚴(yán)格意義上)超集測(cè)試: s != t 而且t 中所有的元素都是s 的成員
s.issuperset(t) s >= t 超集測(cè)試(允許不嚴(yán)格意義上的超集): t 中所有的元素 都是s 的成員
s.union(t) s | t 合并操作:s 或t 中的元素
s.intersection(t) s & t 交集操作:s 和t 中的元素
s.difference(t) s - t 差分操作: s 中的元素,而不是t 中的元素
s.symmetric_difference(t) s ^ t 對(duì)稱差分操作:s 或t 中的元素,但不是s 和t 共有的元素
s.copy() 復(fù)制操作:返回s 的(淺復(fù)制)副本
僅用于可變集合
s.update(t) s |= t (Union) 修改操作: 將t 中的成員添加s
s.intersection_update(t) s &= t 交集修改操作: s 中僅包括s 和t 中共有的成員
s.difference_update(t) s -= t 差修改操作: s 中包括僅屬于s 但不屬于t 的成員
s.symmetric_
difference_
update(t) s ^= t 對(duì)稱差分修改操作: s 中包括僅屬于s 或僅屬于t 的成員
s.add(obj) 加操作: 將obj 添加到s
s.remove(obj) 刪除操作: 將obj 從s 中刪除;如果s 中不存在obj,將引發(fā)KeyError
s.discard(obj) 丟棄操作: remove()的友好版本-如果s中存在obj,從s中刪除它
s.pop() Pop 操作: 移除并返回s 中的任意一個(gè)元素
s.clear() 清除操作: 移除s 中的所有元素
note note