日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python字典和集合对象可以进行索引_Python字典和集合

發(fā)布時(shí)間:2023/12/4 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python字典和集合对象可以进行索引_Python字典和集合 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、泛映射類型

collections.abc 模塊中有 Mapping 和 MutableMapping 這兩個(gè)抽象類,他們的作用是為dict和其他類似的類型定義形式接口。

標(biāo)準(zhǔn)庫(kù)里所有映射類型都是利用dict來(lái)實(shí)現(xiàn)的,因此他們有個(gè)共同的限制,只有可散列的數(shù)據(jù)類型才能用作這些映射里的鍵。

可散列的數(shù)據(jù)類型:在這個(gè)對(duì)象的生命周期中,他的散列值是不變的,而且這個(gè)對(duì)象需要實(shí)現(xiàn)__hash__()方法,還要有__eq__()方法。

▲ 原子不可變數(shù)據(jù)類型(str、bytes和數(shù)值類型)、frozenset都是可散列類型。

▲ 只有當(dāng)一個(gè)元組包含的所有元素都是可散列類型的情況下,它才是可散列的。

字典提供了多種構(gòu)造方法:

>>> a = dict(name='Li', sex='girl')

>>> b = {'name':'Li', 'sex':'girl'}

>>> c = dict(zip(['name','sex'], ['Li','girl']))

>>> d = dict([('name':'Li'), ('sex':'girl')])

>>> e = dict({'name':'Li', 'sex':'girl'})

>>> a == b == c == d == e

True

2、字典推導(dǎo)、默認(rèn)值

2.1、字典推導(dǎo)

從任何以鍵值對(duì)作為元素的可迭代對(duì)象中構(gòu)建出字典。

>>> DIAL_CODE = [

... (86,'China'),

... (1,'United States'),

... ]

>>> country_code = {country:code for code,country in DIAL_CODE}

{'China': 86, 'United States': 1}

>>> {country:code for country,code in country_code.items() if code > 50}

{'China': 86}

2.2、用setdefault處理找不到的鍵

在不進(jìn)行二次查找的情況下更新列表

my_dict.setdefault(key, []).append(new_value)

# 等于

if key not in my_dict:

my_dict[key] = []

my_dict[key].append(new_value)

3、映射的彈性鍵查詢

某個(gè)鍵在映射中不存在時(shí),我們也希望通過(guò)這個(gè)鍵讀取值的時(shí)候能得到一個(gè)默認(rèn)值。

可以使用defaultdict類型,或者自定義一個(gè)dict的子類,實(shí)現(xiàn)__missing__方法。

▲、在實(shí)例化一個(gè)defaultdict的時(shí)候,需要給構(gòu)造方法提供一個(gè)可調(diào)用對(duì)象,這個(gè)可調(diào)用對(duì)象會(huì)在__getitem__找不到鍵的時(shí)候被調(diào)用,讓__getitem__返回某種默認(rèn)值。

如:dd = defaultdict(list) , dd['new_key']

如果new_key在dd中不存在,表達(dá)式dd['new_key']會(huì)按如下步驟執(zhí)行:

(1)、調(diào)用list() 建立一個(gè)新列表。

(2)、把這個(gè)新列表作為值,‘new_key’作為鍵,放到dd中。

(3)、返回這個(gè)列表的引用。

▲、這個(gè)用來(lái)生成默認(rèn)值 list 的可調(diào)用對(duì)象存放在名為 default_factory的實(shí)例屬性里。

▲、如果在創(chuàng)建defaultdict時(shí)沒(méi)有指定 default_factory,查詢不存在鍵會(huì)觸發(fā)keyError 。

▲、defaultdict 里的 default_factory,只會(huì)在__getitem__里被調(diào)用(dd[k]),而dd.get(k)則會(huì)返回None。

特殊方法__missing__,只會(huì)被__getitem__調(diào)用。

提供__missing__方法對(duì)get或者_(dá)_contains__(in 運(yùn)算符會(huì)用到這個(gè)方法)這些方法的使用沒(méi)有影響。

4、字典的變種

collections.OrderedDict:添加鍵的時(shí)候后會(huì)保持順序

>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

collections.ChainMap:容納不同的映射對(duì)象,查找操作時(shí),這些對(duì)象被當(dāng)作一個(gè)整體被逐個(gè)查找。

collections.Counter:整數(shù)計(jì)數(shù)器。 元素被存儲(chǔ)為字典鍵,它們的計(jì)數(shù)被存儲(chǔ)為字典值。

collections.USerDict:讓用戶繼承寫(xiě)子類。對(duì)一個(gè)字典對(duì)象的封裝。其實(shí)例的內(nèi)容保存在一個(gè)普通的字典當(dāng)中,可以通過(guò) UserDict 實(shí)例的屬性 data 訪問(wèn)。

5、不可變映射類型

types模塊引入了一個(gè)封裝類名叫MappingProxyType。如果給這個(gè)類一個(gè)映射,它會(huì)返回一個(gè)只讀的映射視圖。

>>> from types import MappingProxyType

>>> d = {'1':'one'}

>>> d_proxy = MappingProxyType(d)

>>> d_proxy

mappingproxy({'1': 'one'})

>>> d_proxy['1']

'one'

>>> d_proxy['2'] = 'two'

Traceback (most recent call last):

File "", line 1, in

TypeError: 'mappingproxy' object does not support item assignment

>>> d['2'] = 'two'

>>> d_proxy

mappingproxy({'2': 'two', '1': 'one'})

6、集合論

集合的本質(zhì)是許多唯一對(duì)象的聚集。所以,集合可以用于去重。

集合中的元素必須是可散列的,set類型本身是不可散列的,但是forzenset可以。所以可以創(chuàng)建一個(gè)包含不同frozenset的set。

空集合:set()

集合同樣有屬于他的集合推導(dǎo)。

>>> from unicodedata import name

>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}

{'\xa2', '\xac', '§', '±', '\xa9', '\xb5', '\xae', '°', '$', '\xa3', '=', '+', '¤', '%', '÷', '<', '\xa5', '\xb6', '>', '#', '×'}

7、字典中的散列表

散列表是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組)。散列表里的單元叫做表元。

在dict的散列表中,每一個(gè)鍵值對(duì)都占用一個(gè)表元,每個(gè)表元都有兩個(gè)部分,一個(gè)是對(duì)鍵的引用,另一個(gè)是對(duì)值得引用。

所有表元的大小一致,所以可以通過(guò)偏移量來(lái)讀取某個(gè)表元。

Python會(huì)設(shè)法保證大概還有三分之一的表元是空的,在快要達(dá)到閾值的時(shí)候,原有的散列表會(huì)被復(fù)制到一個(gè)更大的空間里面。

如果要把一個(gè)對(duì)象放入散列表,那么首先要計(jì)算這個(gè)元素鍵的散列值。

內(nèi)置的hash()方法用于所有內(nèi)置對(duì)象,自定義對(duì)象調(diào)用hash()實(shí)際上運(yùn)行自定義的__hash__。

如果兩個(gè)對(duì)象在比較時(shí)是相等的,那他們的散列值必須相等。如(1 == 1.0)

▲ 散列值在索引空間中盡量分散開(kāi),越是相似的但不相等的對(duì)象,散列值的差別應(yīng)該越大。如(1.0001和1.0002)

散列表算法:為了獲取my_dict[search_key]的值

(1)首先調(diào)用hash(search_key)計(jì)算search_key的散列值,把這個(gè)值最低幾位數(shù)字當(dāng)做偏移量,在散列表里查找表元。

(2)若找到的表元是空的,拋出KeyError異常

(3)若不為空,表元里會(huì)有一對(duì)found_key:found_value。進(jìn)行檢驗(yàn)search_key == found_key是否為真

(4)相等則返回found_value。不相等則稱為散列沖突。

為了解決散列沖突,算法會(huì)在散列值中另外再取幾位經(jīng)過(guò)計(jì)算處理,把新得到的數(shù)字再當(dāng)做索引來(lái)尋找表元。

一個(gè)可散列對(duì)象必須滿足以下條件:

(1)支持hash()函數(shù),并且通過(guò)__hash__()方法得到的散列值是不變的。

(2)通過(guò)__eq__()方法檢測(cè)相等性。

(3)若a == b為真,則hash(a) == hash(b)也為真。

所有由用戶自定義的對(duì)象默認(rèn)都是可散列的。因?yàn)樗麄兊纳⒘兄涤蒳d()來(lái)獲取,而且他們都不相等。

▲ 字典在內(nèi)存中開(kāi)銷巨大,典型的空間換時(shí)間。

▲ 鍵的次序取決于添加順序

▲ 往字典添加新鍵可能會(huì)改變已有鍵的順序(字典擴(kuò)容決定)

set的實(shí)現(xiàn):也依賴散列表,散列表里存放的只有元素的引用

集合里的元素必須是可散列的。

集合很消耗內(nèi)存。

可以很高效地判斷元素是否存在于某個(gè)集合

元素的次序取決于被添加到集合里的次序

往集合里添加元素,可能會(huì)改變集合里已有元素的次序。

總結(jié)

以上是生活随笔為你收集整理的python字典和集合对象可以进行索引_Python字典和集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。