python映射類型的相關介紹

爱喝马黛茶的安东尼
發布: 2019-06-14 14:01:06
原創
3832 人瀏覽過

映射類型是一類可迭代的鍵-值資料項的組合,提供了存取資料項及其鍵和值的方法,在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 "", 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 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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!