首頁  >  文章  >  後端開發  >  python映射類型的相關介紹

python映射類型的相關介紹

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼原創
2019-06-14 14:01:063939瀏覽

映射類型是一類可迭代的鍵-值資料項的組合,提供了存取資料項及其鍵和值的方法,在python3中,支援兩種無序的映射類型:內建的dict和標準庫中的collections.defaultdict類型。

在python3.1後,也引入了有序的映射類型:collections.OrderedDict.

相關推薦:《python影片

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: &#39;x&#39;
>>>

有了collections.defaultdict,可以代替dict中的get(k,v)和setdefault()方法了。

##3.collections.OrderedDict


######## #OrderedDict是dict子類,支援dict所有方法,記住了插入key的順序。如果新條目覆蓋現有條目,則原始插入位置保持不變。刪除條目並重新插入它將使其移至最後。 # ##
class collections.OrderedDict([items])
###因為是有順序的,所以只有當順序也相同的時候,兩個OrderedDict才相同。但是當OrderedDict和普通dict相比較時,會忽略順序。######
from collections import OrderedDict
d = {&#39;banana&#39;: 3, &#39;apple&#39;: 4}
od1 = OrderedDict({&#39;banana&#39;: 3, &#39;apple&#39;: 4})
od2 = OrderedDict({&#39;apple&#39;: 4, &#39;banana&#39;: 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({&#39;banana&#39;: 3, &#39;apple&#39;: 4})
od1.popitem(False)
print(od1)
###運行結果###
OrderedDict([(&#39;apple&#39;, 4)])
###4. 簡單增強# #####OrderedDict只是保持了插入的順序,當條目被修改時,順序不會修改。###
od1 = OrderedDict({&#39;banana&#39;: 3, &#39;apple&#39;: 4})
od1[&#39;banana&#39;] = 5print(od1)
###運行結果###
OrderedDict([(&#39;banana&#39;, 5), (&#39;apple&#39;, 4)])
###但是有時我們需要修改和插入時同樣的效果,可以簡單的增強一下,重寫__setitem__()方法當修改時先刪除該元素然後再插入。###
class EnhancedOrderedDict(OrderedDict):
    def __setitem__(self, key, value):        
        if key in self:
           del self[key]
       OrderedDict.__setitem__(self, key, value)
###測試###
eod = EnhancedOrderedDict({&#39;banana&#39;: 3, &#39;apple&#39;: 4})print(eod)
eod[&#39;banana&#39;] = 5print(eod)
###運行結果###
EnhancedOrderedDict([(&#39;banana&#39;, 3), (&#39;apple&#39;, 4)])
EnhancedOrderedDict([(&#39;apple&#39;, 4), (&#39;banana&#39;, 5)])

以上是python映射類型的相關介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn