2016-09-14 54 views
2

我在sorting dictionaries上讀到這個真正有用的SO貼子。其中最流行的答案表明這一點:瞭解Python中的dictionary.get

sorted(dict1, key=dict1.get) 

雖然這看起來完全正常工作,我沒有得到key=dict1.get部分。

這裏的get究竟是什麼,它有什麼作用?

我只熟悉使用get('X')從字典中提取X ... 我找不到在docs的字典和stdtypes任何東西,所以任何指針非常感謝!

注意這裏是they必須說的關於get(),還是這是完全不同的東西? 謝謝!

get(key [,default]) 如果key在字典中,則返回key的值,否則爲default。如果未指定默認值,則默認爲None,因此此方法不會產生KeyError

+2

什麼讓您感到困惑?你顯然知道在字典上調用了什麼'.get',這就是字典中每個鍵被調用的內容。 – jonrsharpe

+3

最好的方法是啓動一個終端並自己測試 – danidee

+1

如果你閱讀過'sorted'(帶有'key'參數)和'dict.get',我不知道還有什麼是留下解釋。 – TigerhawkT3

回答

7

key自變量爲sorted是一個可調用(例如函數),它採用一個參數。

默認情況下,sorted通過將它們相互比較來對值進行排序。例如:

sorted([2, 3, 1]) # returns [1, 2, 3] 

這是因爲1 3。

另一方面,如果應該使用不同的值進行比較,那麼可以用key來定義。例如,由長度字符串進行排序,一個coudld做:

def string_length(s): 
    return len(s) 

sorted(['abcd', 'efghi', 'jk'], key=string_length) # returns ['jk', 'abcd', 'efghi'] 

這是因爲string_length('jk') < string_length('abcd') < string_length('efghi')

但不是功能,你可以通過任何其他可調用。在你的例子中,那就是dict1.get,所以對於字典中的每個鍵,dict1.get(key)將被執行,並將其結果用於比較。

dict1 = {'a':3, 'b':1, 'c':2} 

sorted(dict1, key=dict1.get) # returns ['b', 'c', 'a'] 

這是因爲dict1.get('b') < dict1.get('c') < dict1.get('a')

+0

只是爲了簡化你的「按長度排序」,你可以使用'key = len'。 :-)或者是包裝功能故意? – MSeifert

+0

謝謝,這個真的很清楚。 – patrick

+0

@MSeifert是的,我只是希望它更容易理解,所以我創建了一個新函數,當然'key = len'會更快,代碼更少,實際上更具可讀性(如果您知道這些東西工作)。 – zvone

2

正如您發現的那樣,get只是獲取與給定鍵對應的值。 sorted將遍歷它傳遞的迭代。在這種情況下,迭代是dict,並通過迭代遍歷dict只是遍歷其鍵。如果您想根據值進行排序,則需要將鍵轉換爲相應的值,當然,執行此操作的顯而易見的方法是使用get

爲了澄清,這是爲了如果你想要一個鍵列表根據它們的值排序。如果你只是想一個值排序列表,你可以做sorted(dict1.values()),如果你想通過自己的價值排序的鍵(不是值它們映射到),你可以只是做sorted(dict1)

例子:

>>> d = {'a': 3, 'b': 2, 'c': 1} 
>>> sorted(d) 
['a', 'b', 'c'] 
>>> sorted(d.values()) 
[1, 2, 3] 
>>> sorted(d, key=d.get) 
['c', 'b', 'a'] 
3
sorted(dict1, key=dict1.get) 

是說的更簡潔,更Python的方式:

sorted(dict1, key=lambda x: dict1[x] if x in dict1 else None) 

記住,在字典集合將會返回它的鑰匙,因此get方法使用字典鍵的參數,而字典鍵又返回鍵指向的值。

TL; DR這是一種使用值作爲排序標準對字典鍵進行排序的簡單方法。

1

sorted([dictionnary],[function])的第二個參數是一個函數,而不是一個值:

這意味着該方法將根據通過施加到物品的函數返回的值進行比較的密鑰。

括號的函數調用後加入平均要傳遞的值,而沒有括號傳遞函數

dict.get(x)是關鍵X在字典

dict.get值是獲取功能從dict1

上述假設值,我們有

d = {'a': 3, 'b': 2, 'c': 1} 

​​將比較'a','b'和'c',而sorted(d,d.get)將比較d.get('a'),d.get('b')d.get('c')