本文主要討論如何在字典上執(zhí)行各種操作(諸如求最值陕习,排序等)膊升。
在正式開始前法焰,我們先試著對另一個問題進行理解,問題如下:
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
對prices執(zhí)行
print(list(zip(prices.keys(), prices.values())))
執(zhí)行結(jié)果:[('ACME', 45.23), ('IBM', 205.55), ('AAPL', 612.78), ('FB', 10.75), ('HPQ', 37.2)]
(zip() creates an iterator, so we use list to show the results)
我們注意到埃仪,由于字典是無序的乙濒,所以我們打印出來的內(nèi)容是無序的,即
prices.keys()
和prices.values()
生成的是無序的內(nèi)容颁股。
然后zip()函數(shù)從這兩個無序的內(nèi)容序列中每次各取一個形成元素對,組成list傻丝。我們卻發(fā)現(xiàn)list中的每一個元素對都是匹配的甘有,也就是說,無論我們運行多少次葡缰,不管元素對之間的相對順序如何,但是每個元素對的“鍵-值”仍然是匹配的泛释。
所以我們可以大膽猜測:這個keys()與values()同時獲取了一次字典狀態(tài)滤愕。或者說怜校,當我們請求讀取字典時,字典“停留”在某個狀態(tài)茄茁,然后我們再一次性分別對keys與values進行取值魂贬。(所以“鍵-值”對應是理所當然的事情啦)
下面進入正題:
直接上代碼:
min_price = min(zip(prices.values(), prices.keys()))
max_price = max(zip(prices.values(), prices.keys()))
prices_sorted = sorted(zip(prices.values(), prices.keys()))
注意:我們在求最值和排序時,對字典的“鍵-值”進行了反轉(zhuǎn)(即把values()放在了keys()前面)裙顽,因為min,max,sorted這三個函數(shù)默認以第一個位置的值作為排序依據(jù),所以如果我們沒有反轉(zhuǎn)的話锦庸,那么排序的依據(jù)(在此字典中)就是keys中字符串的字母順序了机蔗。
補充一下:如果第一個位置的值相等的話,就會繼續(xù)比較第二個位置,以此類推萝嘁。
另一種方法:
min(prices, key=lambda k: prices[k]) #Returns 'FB'
max(prices, key=lambda k: prices[k]) #Returns 'AAPL'
上面的操作返回的是“鍵”,為了得到“值”我們還需要進一步寫:
min_value = prices[min(prices, key=lambda k: prices[k])]
總結(jié):兩種方法各有利弊牙言,需要根據(jù)具體情況來判斷(雖然這好像是句廢話=_=)酸钦。。咱枉。