python 映射和反映射_python映射类型的相关介绍
映射類型是一類可迭代的鍵-值數據項的組合,提供了存取數據項及其鍵和值的方法,在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 "", line 1, in cd5["x"]KeyError: 'x'>>>
有了collections.defaultdict,可以代替dict中的get(k,v)和setdefault()方法了。
3.collections.OrderedDict
OrderedDict是dict子類,支持dict所有方法,記住了插入key的順序。如果新條目覆蓋現有條目,則原始插入位置保持不變。 刪除條目并重新插入它將使其移至最后。class collections.OrderedDict([items])
因為是有序的,所以只有當順序也相同的時候,兩個OrderedDict才相同。但是OrderedDict和普通dict相比較時,會忽略順序。from collections import OrderedDictd = {'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 OrderedDictod1 = 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 映射和反映射_python映射类型的相关介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没有语言基础可以学python_没有Py
- 下一篇: 上古卷轴5代码有哪些 上古卷轴5最全代码