python列表里面找字典對應的值 python如何輸入字典的名稱?
python如何輸入字典的名稱?它是通過字典賦值來實現(xiàn)的。先寫變量,然后把寫好的字典數(shù)據(jù)賦給變量,簡單來說就是變量dict大括號。通過以這種分配變量,可以通過直接調用變量名來使用字典。這個變量名就是字
python如何輸入字典的名稱?
它是通過字典賦值來實現(xiàn)的。先寫變量,然后把寫好的字典數(shù)據(jù)賦給變量,簡單來說就是變量dict大括號。通過以這種分配變量,可以通過直接調用變量名來使用字典。這個變量名就是字典的名字,它所指向的內存地址不會改變,這是唯一的數(shù)據(jù)。
如何理解Python中的集合和字典?
字典和集合是高度優(yōu)化的數(shù)據(jù)結構,特別是對于查找、添加和刪除操作。本節(jié)將通過示例介紹它們在特定場景中的性能,并將它們與列表等其他數(shù)據(jù)結構進行比較。
例如,有一個存儲產品信息(產品ID、名稱和價格)的列表,現(xiàn)在的需求是借助產品ID找出價格。實現(xiàn)代碼如下:
定義查找_產品_價格(產品,product_id):
對于id,products:的價格
如果我是product_id:
退貨價格
不返回
產品[
(111, 100),
(222, 30),
(333, 150)
]
打印(產品222的價格是{}。格式(find_product_price(products,222)))
運行結果如下:
產品222的價格是30英鎊
在上述方案的基礎上,如果鏈表有n個元素,由于搜索過程需要遍歷鏈表,那么最壞情況下的時間復雜度為O(n)。即使先對列表進行排序,再使用二分搜索法算法,也要O(logn)時間復雜度,更不用說O(nlogn)時間對列表進行排序了。
但是如果用字典來存儲這些數(shù)據(jù),那么查找會非常方便高效,而且可以用O(1)的時間復雜度來完成,因為不需要遍歷字典,直接通過鍵的哈希值就可以找到對應的值。實現(xiàn)代碼如下:
產品{
111: 100,
222: 30,
333: 150
}
打印(產品222的價格是{}。格式(產品[222])
運行結果如下:
產品222的價格是30英鎊
一些讀者可能對時間復雜性不感興趣。它不 如果你有直觀的理解,這并不重要。我再給你舉個例子。在下面的代碼中,初始化100,000個元素的產品,分別計算使用list和set統(tǒng)計產品價格數(shù)量的運行時間:
#統(tǒng)計時間需要使用時間模塊中的函數(shù),就知道了。
導入時間
def find_unique_price_using_list(products):
唯一價格列表[]
對于_,products:的價格# A
如果價格不在unique_pric: # B
唯一價格(價格)
return len(唯一價格列表)
id[范圍(0,100000)中x的x]
價格[x對x,在范圍(200000,300000)內]
產品列表(郵政編碼(id,價格))
#計算列表版本的時間
start_using_list _counter()
查找_唯一_價格_使用_列表(產品)
end_using_list _count: { }打印(經過的時間)。格式(結束使用列表開始使用列表)
#使用集合做同樣的工作
def find_unique_price_using_set(products):
unique_price_set集合()
對于_,products:的價格
唯一價格(價格)
return len(唯一價格集)
#計算集合版本的時間
啟動使用設置計數(shù)器()
查找_唯一_價格_使用_集合(產品)
end_using_set _count: { }打印(經過的時間)。格式(結束使用設置開始使用ng_s: 68的時間流逝。56866 . 66666666667
使用s: 0.01表示時間流逝。58660.08888888861
可見兩者在只有10萬條數(shù)據(jù)的情況下,速度相差如此之大。而企業(yè)的后臺數(shù)據(jù)往往是幾億甚至幾十億的量級。因此,如果使用不合適的數(shù)據(jù)結構,很容易導致服務器崩潰,不僅影響用戶體驗,還會給公司帶來巨大的財產損失。
那么,為什么字典和收藏的效率如此之高,尤其是查找、插入和刪除的操作?
字典和收藏的工作原理。
字典和集合的效率與其內部數(shù)據(jù)結構密切相關。與其他數(shù)據(jù)結構不同,字典和集合的內部結構是哈希表:
對于字典來說,這個表存儲三個元素:散列、鍵和值。
對于集合,哈希表中只存儲一個元素。
對于以前版本的Python,其哈希表結構如下:
|哈希值(哈希)鍵值(值)
。|...
0 |哈希0鍵0值0
。|...
1 | hash1 k:·邁克,dob: 1999-01-01,g:男}
然后,它將以類似于下面的形式存儲:
條目[
[ - , - , - ]
[-230273521,出生日期,1999年1月1日],
[ - , - , - ],
[ - , - , - ],
[1231236123,姓名,邁克],
[ - , - , - ],
[9371539127,性別,男]
]
顯然,這是對存儲空間的極大浪費。為了提高存儲空間的利用率,目前的哈希表除了字典本身的結構之外,還會將索引與哈希值、鍵和值分開,就是下面這種結構:
指數(shù)
-
無|索引|無|無| index |無|索引...
-
進入
-
哈希0鍵0值0
-
hash1 key1值1
-
hash2鍵2值2
-
...
-
在此基礎上,上述字典在新哈希表結構下的存儲形式為:
索引[無,1,無,無,0,無,2]
條目[
[1231236123,姓名,邁克],
[-230273521,出生日期,1999年1月1日],
[9371539127,性別,男]
]
通過對比可以發(fā)現(xiàn),空間利用率有了很大的提高。
明確具體的設計結構,然后分析如何使用哈希表完成數(shù)據(jù)的插入、查找和刪除。
哈希表插入數(shù)據(jù)
在向字典中插入數(shù)據(jù)時,Python會先根據(jù)鍵(通過hash(key)函數(shù))計算出相應的哈希值,而在向集合中插入數(shù)據(jù)時,Python會根據(jù)元素本身(通過hash (value)函數(shù))計算出相應的哈希值。
例如:
dic {nam:1}
打印(哈希(名稱))
s《哈希表詳解》 "可以細讀。
哈希表查找數(shù)據(jù)
在哈希表中查找數(shù)據(jù)類似于插入操作。Python會根據(jù)哈希值找到元素在哈希表中應該存放的位置,然后將其哈希值和key與該位置的元素進行比較(集合直接比較元素值):
如果它們相等,就證明找到了;
另一方面證明了元素存儲的時候遇到了哈希,需要繼續(xù)用原來的方法解決哈希,直到找到元素或者找到空位。
這里發(fā)現(xiàn)的空白意味著目標元素沒有存儲在哈希表中。
哈希表刪除元素
對于刪除操作,Python會臨時給這個位置的元素賦一個特殊值,然后在哈希表調整大小時刪除它。
應該注意的是,哈希的發(fā)生通常會降低字典和集合操作的速度。因此,為了保證其效率,集合中的字典和哈希表通常會保證至少留有1/3的剩余空間。隨著元素的不斷插入,當剩余空間不足1/3時,Python會重新獲得更多的內存空間并擴展哈希表,同時表中所有的元素位置都會重新排出。