2017-07-02 55 views
-1

我剛剛開始用lambda函數弄溼我的腳,這真的讓我發瘋。我知道我在這裏的困難僅僅取決於我對lambda函數的一般理解力弱,所以請每個輸入都被接受。你能幫我理解這個lambda函數嗎?

給定一個空格分隔字符串的字符串(例如「128 555 3217 256」),函數返回一個新的字符串,按每個數字中所有數字的總和排序,如果有兩個相等的值(如3215和256,都有13),命令是按字母順序給出的。

>>>_str = "128 555 3217 256" 
>>>print(' '.join(sorted(sorted(_str.split(' ')), key=lambda x: sum(int(c) for c in x)))) 
128 256 3217 555 

我真的不明白的是,顯然拉姆達僅在這裏工作,只有在功能,X和C創建的變量...那麼,它得到的字符串? 我知道,我只是很困惑......

回答

3

考慮以下幾點:

li = [2, 1, 3] 
sorted_li = sorted(li, key=lambda x: x) 

這個例子是非常基本的(併爲示範起見,不必要使用key和拉姆達)。

sortedli傳遞每個元素它得到了key參數的函數,並希望得到一個值,該值將告訴它如何對列表進行排序(基本上,key函數告訴sorted元素如何互相比較)。

在上面的例子中,key函數接收一個元素,將其稱爲局部變量x,並將其原樣返回。

在你的例子中,它總結了數字(在你的例子中x是一組數字)。

0

lambda可用作等式並用於減少程序中的代碼行數。 Here int(c)for c in x x是總字符串,c是字符串包含空格的分隔值,如您使用 split('')。

4

該lambda被傳遞給sorted作爲參數key。查看documentationsorted()函數。

key指定一個用於從每個列表元素提取比較鍵的參數的函數:key = str.lower。默認值是None(直接比較元素)。

簡而言之,key是一種有效用作排序比較器的函數。 sorted根據它的輸出對列表進行排序,而不是找出元素應該自己排列的順序。

您傳遞給sorted()的拉姆達需要x,因爲它只是參數。 sorted()然後將它正在排序的列表中的每個元素傳遞給該lambda,因此在lambda中對x的任何引用都對應於該元素。

key=lambda x: sum(int(c) for c in x))) 
#^  ^
#Key arg x is the lambda's only argument 

在你的情況下,被傳遞到拉姆達元素是一個字符串,表示要得到的總和誰的位數。 lambda然後遍歷它們,將它們轉換爲整數,並返回它們的總和。

一旦完成,sorted()使用這些總和來按升序對字符串進行排序。

2

sorted的簽名是sorted(iterable[, key][, reverse])

key指定一個用於從每個列表元素提取比較鍵的參數的函數:key = str.lower。默認值是None(直接比較元素)。

因此,對於key=None的默認值,sorted將通過直接比較值進行排序。現在(即[2,3,1]通過比較2 < 3等排序),如果你指定一個函數fookey,接受一個參數並返回一個值,sorted將改用由foo返回的值進行比較(即[2,3,1]通過比較排序foo(2) < foo(3)等)

你的情況:sorted(_str.split(' ')), key=lambda x: sum(int(c) for c in x))

通過分割字符串創建list,並與key=lambda x: sum(int(c) for c in x)排序,所以它會通過在key分離子x到拉姆達每個空間,這將返回比較值總結其數字sum(int(c) for c in x)

請注意,這不需要lambda函數,它只需要一個具有正確簽名的函數 - 即接受一個參數並返回一個可以進行比較的函數。所以我們可以定義:

def foo(x): 
    return sum(int(c) for c in x) 

並且通過foo代替。

>>> print(' '.join(sorted(sorted(_str.split(' ')), key=foo))) 
128 256 3217 555 
相關問題