2016-09-30 59 views
2

我正在閱讀Python的教程介紹,我一直在理解一段代碼。這是來自教程的第4.7.5節。Python初學者 - 使用lambda函數對元組進行排序

pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] 
pairs.sort(key=lambda pair: pair[1]) 
pairs 

的碼,該位因此,在一個行返回

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')] 

,它定義了與不同元組的列表對。我明白了。 第二行是我完全拋棄的地方,我已經做了相當多的修改,試圖瞭解發生了什麼。

我發現sort()正在向變量對應用一個內置函數,並且大概是按照我給它的指令對它進行排序。

sort()函數需要一個鍵,並且鍵必須使用函數定義,因此使用lambda。我認爲所有這些都是正確的,但我可能會離開這裏。

Lambda在冒號左側定義了一個新參數「pair」,右側是定義lambda函數返回值的計算。

這就是我被扔掉的地方。 「pair [1]」是做什麼的?它對結腸左側「對」的影響是什麼?

它返回什麼值?除了像這樣編碼之外,我似乎無法讓它返回任何價值。

我猜測它以某種方式指向特定的元組,並基於重新定位對它進行排序,但我不確定其背後的邏輯。

任何人都可以解釋這對我嗎?謝謝。

+0

用'lambda'你可以引用你需要排序的值。 –

+0

如果你第一次做'key = lambda pair:pair [1]',然後調用'key(pairs [0])',並將它與'key(pairs [1])'進行比較會有幫助嗎?如果我告訴你,最終結果按字母順序排列在每個元組的第二個元素上? –

回答

0

您的lambda函數將一個元組作爲輸入並返回索引爲1的元素(因此第二個元素自第一個元素起,索引爲0)。 所以排序只考慮每個元組的第二個元素(英文單詞)。這就是爲什麼您的輸出在第二個元素中按字母順序排列的原因'four'>'one'>'three'>'two'

+0

非常感謝。我一直盯着這幾個小時。我認爲它指向了「對」變量中的位置(一旦我的思想陷入困境,就沒有回來了,而不是元組的位置,現在變得更有意義了,謝謝! –

0

A lambda是一個簡化函數,僅使用一個表達式。

任何拉姆達可以寫成一個函數,由表達式之前加入在return,所以lambda pair: pair[1]變爲:

def lambda_function(pair): return pair[1] 

所以在list.sort()呼叫這裏拉姆達返回每個序列的元件(Python索引從0開始)。

您可以將此可見通過分配拉姆達給一個變量,也就是說,key

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] 
>>> key = lambda pair: pair[1] 
>>> key(pairs[0]) 
'one' 
>>> key(pairs[1]) 
'two' 

list.sort()方法使用這些電話的輸出(一次列表中的每個元素)的元素進行排序。因此,對於4個元素,函數返回'one','two','three''four',然後將這4個元素純粹按這4個字符串的字典順序排序。該訂單將是'four','one','three','two',這是您在最終排序列表中反映的內容。

在Randal L. Schwartz之後,在Perl中推廣這項技術之後,這種通過替代鍵排序的方法通常被稱爲Schwartzian transform

1

有時候開始使用lambda時,明確寫出該函數會更容易。你的lambda函數等同於:根據返回值

def sort_key(pair): 
    int_value, string_value = pair 
    return string_value 

因爲list.sort訂單項目:

def sort_key(pair): 
    return pair[1] 

如果我們想更詳細的,我們可以解開對使它更加明顯key函數(如果存在),現在我們看到它正在對它們的字符串值進行排序。由於字符串按字典順序排序,所以"four"出現在"one"之前(認爲按字母排序)。