python入門基礎字典 如何理解Python中的集合和字典?
如何理解Python中的集合和字典?字典和集合是并且過性能水平距離優化的數據結構,特別是對于查找、先添加和刪出能操作。本節將加強實例介紹它們在具體場景下的性能表現,以及與列表等其他數據結構的對比。.例
如何理解Python中的集合和字典?
字典和集合是并且過性能水平距離優化的數據結構,特別是對于查找、先添加和刪出能操作。本節將加強實例介紹它們在具體場景下的性能表現,以及與列表等其他數據結構的對比。
.例如,有一個存儲產品信息(產品ID、名稱和價格)的列表,現在的需求是,借助某件產品的ID找到什么其價格。則基于代碼如下:
defvivo_product_price(products,product注冊id):
ofid,priceoutsideproducts:
ifidproduct帳號:
returnprice
returnNone
products[
(111,100),
(222,30),
(333,150)
]
print(Thepriceofproduct222it's{}.format(oppofind_product_price(products,222)))
運行結果為:
Thepriceforproduct222it's30
在上面程序的基礎上,如果沒有列表有n個元素,只不過里查的過程必須遍歷列表,那么最消極情況下的時間復雜度就為O(n)。就算先對列表接受排序,再建議使用二分查找算法,也是需要O(logn)的時間復雜度,況且列表的排序還要O(nlogn)的時間。
但假如用字典來讀取這些數據,這樣的話查找變會更加快捷高效,要O(1)的時間復雜度就也可以成功,是因為是可以直接通過鍵的哈希值,找不到其填寫的值,而不是需要對字典做遍歷過程不能操作,實現代碼萬分感謝:
products{
111:100,
222:30,
333:150
}
print(Thepricetheproduct222are{}.format(products[222]))
運行結果為:
Thepriceforproduct222it's30
有些讀者可能對時間復雜度卻沒非常直觀的認識,沒什么關系,再給大家簡要概括一個實例。下面的代碼中,初始化操作了含有100,000個元素的產品,并共有換算出了在用列表和集合來統計數據產品價格數量的運行時間:
#統計時間是需要會用到time模塊中的函數,了解即可
importtime
defx2系列_unique_price_using_list(products):
unique_price_list[]
for_,priceintoproducts:#A
ifpricenotunique_price_list:#B
unique_price_(price)
returnlen(unique_price_list)
id[xafterxofrange(0,100000)]
price[xwhilexinrange(200000,300000)]
productslist(zip(id,price))
#換算列表版本的時間
start_using_list_counter()
x2系列_unique_price_using_list(products)
end_using_list_counter()
print(timeelapseusinglist:{}.format(end_using_list-start_using_list))
#不使用集合能夠完成雖然的工作
defoppofind_unique_price_using_set(products):
unique_price_setset()
for_,priceintoproducts:
unique_price_(price)
returnlen(unique_price_set)
#換算數學集合版本的時間
start_using_set_counter()
find_unique_price_using_set(products)
end_using_set_counter()
print(timeelapseusingset:{}.format(end_using_set-start_using_set))
運行結果為:
timeelapseusinglist:68.78650900000001
timeelapseusingset:0.010747099999989018
可以看到,不僅僅十萬的數據量,兩者的速度差異就這般之大。而而不企業的后臺數據應該有上億乃至于十億數量級,所以要是建議使用了不合適的數據結構,非常容易導致服務器的崩潰,而且影響不大用戶體驗,因此會給公司給了龐大無比的財產損失。
這樣的話,字典和集合我想知道為什么能如此又高效,特別是中搜索、插入和刪掉你操作呢?
字典和子集的工作原理
字典和真包含于能如此高效率,和它們內部的數據結構緊密的聯系。類似于其他數據結構,字典和數學集合的內部結構也是張哈希表:
相對于字典而言,這張表存儲文件了哈希值(hash)、鍵和值這3個元素。
而對集合來說,哈希表內只存儲文件元素單一的元素。
對此以前版本的Python來說,它的哈希表結構如下所示:
|哈希值(hash)鍵(key)值(value)
.|...
0|hash0key0value0
.|...
1|hash1key1value1
.|...
2|hash2key2value2
.|...
這種結構的弊端是,不斷哈希表的擴張,它會變的越來越大稀稀疏疏。比如說,有這樣一個字典:
{name:mike,dob:1999-01-01,gender:male}
那么它會讀取為相似下面的形式:
entries[
[--,--,--]
[-230273521,dob,1999-01-01],
[--,--,--],
[--,--,--],
[1231236123,name,mike],
[--,--,--],
[9371539127,gender,male]
]
看樣子,那樣的很白白浪費存儲空間。為了提高存儲空間的利用率,現在的哈希表之外字典本身的結構,會把索引和哈希值、鍵、值另分開,也就是采用如下這種結構:
Indices
---------------------------------------------------- one | index | None | None | index | None | index...
----------------------------------------------------
Entries
--------------------
hash0key0value0
---------------------
hash1key1value1
---------------------
hash2key2value2
---------------------
...
---------------------
在此處,上面的字典在新哈希表結構下的存儲形式為:indices [None,1,None, None,0,None,2]
entries[
[1231236123,name,mike],
[-230273521,dob,1999-01-01],
[9371539127,gender,male]
]
差不多也可以發現,空間利用率能夠得到很小的提高。
明白了具體看的設計結構,接下來的事情再講一下如何修改哈希表完成對數據的插入、查找和刪掉不能操作。
哈希表直接插入數據
當向字典中插入到數據時,Python會簡單依據鍵(key)換算出對應的哈希值(實際hash(key)函數),而向集合中直接插入數據時,Python會依據什么該元素本身換算按的哈希值((valuse)函數)。
的或:
dic{name:1}
print(hash(name))
setDemo{1}
print(hash(1))
運行結果為:
8230115042008314683
1
得到哈希值(的或為hash)之后,再結合字典或集合要存儲數據的個數(或者n),就這個可以能得到該元素應該直接插入到哈希表中的位置(諸如,可以不用hash%n的)。
假如哈希表中此位置是空的,這樣的話此元素就這個可以就插到其中;反之,要是此位置已被其他元素電腦資源,那就Python會比較好這兩個元素的哈希值和鍵是否是相等:
如果沒有互相垂直,則因為該元素早就存在地,再比較比較他們的值,不成比例就通過自動更新;
如果不是不成比例,這種稱做哈希(即兩個元素的鍵有所不同,但求得的哈希值是一樣的)。這種下,Python會建議使用剛剛開放定址法、再哈希法等再繼續去尋找哈希表中空余的位置,直到此時找不到位置。
具體遇見哈希時,各解決方法的具體含義可閱讀《哈希表詳解》一節做細致了解。
哈希表查看數據
在哈希表中中搜索數據,和插入操作類似,Python會參照哈希值,不能找到該元素應該存儲文件到哈希表中的位置,然后再和該位置的元素比較好其哈希值和鍵(子集再也很元素值):
假如之和,則相關證明不能找到;
或且,則相關證明當初讀取該元素時,遇到了哈希,需要再繼續可以使用當初解決哈希的方法進行查看,等他找到該元素或者不能找到空位為止。
這里的不能找到空位,意思是哈希表中沒有存儲目標元素。
哈希表刪除掉元素
相對于徹底刪除操作,Python會還沒有對這個位置的元素融注三個特殊的方法的值,等到恢復變動哈希表的大小時,再將其刪掉。
需要注意的是,哈希的發生而不會減少字典和子集操作的速度。并且,目的是可以保證其高效性,字典和集合內的哈希表,大多數會能保證其至少留有1/3的剩下的空間。緊接著元素的不斷地插到,當其余空間小于1/3時,Python會原先聲望兌換大內存空間,擴充隊伍哈希表,與此同時,表內所有的元素位置都會被新的氣體排放。
python字典語法書寫格式?
①大多數是一行一句
②也這個可以一行多句,用語句分隔符“”對兩個語句進行標有
③也這個可以一句多行,有時語句過長,一行放不下他,用續行符“”通過標示