映射類型是一類可迭代的鍵-值資料項的組合,提供了存取資料項及其鍵和值的方法,在python3中,支援兩種無序的映射類型:內建的dict和標準庫中的collections.defaultdict類型。
在python3.1後,也引入了有序的映射類型:collections.OrderedDict.
相關推薦:《python影片》
特點:
1.只有可哈希運算的物件可用於映射類型中的鍵,因此,內建的固定的資料類型都可以用作映射類型中的鍵(內建固定的類型都可進行哈希運算),目前接觸到的固定資料類型有:int、float、complex、bool、str、tuple、frozenset;
#2.每個鍵相關聯的值可以是任意物件;
3.映射類型也是可迭代的(iterable)。
4.映射類型可以使用比較運算子進行比較,可以使用成員關係符in/not in和內建len()函數。
1.dict(字典)
#dict資料類型是一種無序的、可變的組合資料類型,其中包含0 -n個鍵值對,鍵是指向可雜湊運算的物件的引用,值可以指向任意物件的引用。由於鍵是可哈希運算的物件引用,因此保證了鍵的唯一性;由於dict是可變的,因此可以對dict進行資料項的新增和移除操作;由於dict是無序的,因此沒有索引,也不能使用分片運算子來操作。
字典的建立
1.dict()可以作為一個函數調用,此時建立一個空dict:
>>> dict() {} >>>
dict()中傳入一個映射類型的參數時,將傳回以該參數為基礎的字典,如:
>>> d1 = {"key1":"value1","key2":"value2"} >>> dict(d1) {'key1': 'value1', 'key2': 'value2'} >>>
dict() 也可以接受序列類型的參數,但是前提是序列中的每一個資料項本身是一個包含兩個物件的序列,第一個用作鍵,第二個用作值,如:
>>> d1 = dict((("k1","v1"),("k2","v2"))) #使用元组创建 >>> d1 {'k1': 'v1', 'k2': 'v2'} >>> >>> d1 = dict([("k1","v1"),("k2","v2")]) #使用序列创建 >>> d1 {'k1': 'v1', 'k2': 'v2'} >>>
dict() 中還可以關鍵字參數進行創建,其中鍵作為關鍵字,值作為關鍵字的值,如:
>>> dict(id=1,name="zhangsan",age=23) {'id': 1, 'name': 'zhangsan', 'age': 23} >>>
注意:關鍵字必須為有效的python標識符
2.使用花括號建立dict,空{}會建立一個空的dict ,非空dict由多個項目組成,每一項由逗號分隔,其中每一項都使用K:V 的形式創建,如:
>>> dict2 = {"name":"kobe","age":33,"num":24} >>> dict2 {'name': 'kobe', 'age': 33, 'num': 24} >>>
3.使用字典內涵創建字典
defaultdict是dict的子類,它支援dict的所有的操作和方法。和dict的不同之處在於,如果dict中不包含某一個鍵,則透過dict[x]取值時出現KeyError異常,但是如果是defaultdict,則會建立一個新的項,鍵為該鍵,值為預設值.
2.collections.defaultdict(預設字典)
#建立collections.defaultdict
#創建collections.defaultdict時,透過collections.defaultdict(),根據參數可以有兩種方式進行建立:
* 1.使用參數類型來建立:
>>> import collections >>> cd1 = collections.defaultdict(int) >>> cd2 = collections.defaultdict(list) >>> cd3 = collections.defaultdict(str) >>> cd1["x"] 0 >>> cd2["x"] [] >>> cd3["x"] '' >>>
這裡分別使用了int、 list、str,他們的預設值分別為0,[],”
* 2.使用函數名稱來建立:
>>> def name(): return 'zhangsan' >>> cd4 = collections.defaultdict(name) >>> cd4["x"] 'zhangsan' >>>
透過這種方式,可以讓預設字典的預設值更有彈性。
需要注意的是,collections.defaultdict()可以不傳入參數或傳入None,但是如果這樣,則不支援預設值,例如:
>>> cd5 = collections.defaultdict() >>> cd5["x"] Traceback (most recent call last): File "<pyshell#254>", line 1, in <module> cd5["x"] KeyError: 'x' >>>
有了collections.defaultdict,可以代替dict中的get(k,v)和setdefault()方法了。
##3.collections.OrderedDict
class collections.OrderedDict([items])###因為是有順序的,所以只有當順序也相同的時候,兩個OrderedDict才相同。但是當OrderedDict和普通dict相比較時,會忽略順序。######
from collections import OrderedDict d = {'banana': 3, 'apple': 4} od1 = OrderedDict({'banana': 3, 'apple': 4}) od2 = OrderedDict({'apple': 4, 'banana': 3}) print(od1 == od2) print(od1 == d)###運行結果###
FalseTrue###3. 關鍵方法###
OrderedDict.popitem(last=True)###普通dict的該方法不接受參數,只能將最後一個條目刪除;OrderedDict比dict更為靈活,接受一個last參數:當last=True時和普通方法一樣,符合LIFO順序;當last=False時候,刪除第一個元素,符合FIFO順序。###
from collections import OrderedDict od1 = OrderedDict({'banana': 3, 'apple': 4}) od1.popitem(False) print(od1)###運行結果###
OrderedDict([('apple', 4)])###4. 簡單增強# #####OrderedDict只是保持了插入的順序,當條目被修改時,順序不會修改。###
od1 = OrderedDict({'banana': 3, 'apple': 4}) od1['banana'] = 5print(od1)###運行結果###
OrderedDict([('banana', 5), ('apple', 4)])###但是有時我們需要修改和插入時同樣的效果,可以簡單的增強一下,重寫__setitem__()方法當修改時先刪除該元素然後再插入。###
class EnhancedOrderedDict(OrderedDict): def __setitem__(self, key, value): if key in self: del self[key] OrderedDict.__setitem__(self, key, value)###測試###
eod = EnhancedOrderedDict({'banana': 3, 'apple': 4})print(eod) eod['banana'] = 5print(eod)###運行結果###
EnhancedOrderedDict([('banana', 3), ('apple', 4)]) EnhancedOrderedDict([('apple', 4), ('banana', 5)])
以上是python映射類型的相關介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!