2016-10-10 47 views
-1

在以下Python腳本中,「aDict」是一個字典,「_:_ [0]」在lambda函數中做什麼?這是在Python lambda函數中做了什麼?

sorted(aDict.items(), key=lambda _: _[0]) 
+4

'_'只是一個變量。它根據字典的第一項對它們進行排序。 – Li357

+1

小擴展,'_'可能是'my_var'或'foo'或'woo'。就像@AndrewL。說,它只是一個變量名稱。 – idjaw

+4

這個關鍵字也完成了對那個特定代碼的字面解釋。 – TigerhawkT3

回答

1

讓我們挑選一下。

1)假設你有一個字典,二:

di={'one': 1, 'two': 2, 'three': 3} 

2)現在假設你想它的每一個鍵,值對:

>>> di.items() 
[('three', 3), ('two', 2), ('one', 1)] 

3)現在,你想對它們進行排序(因爲類型的字典是無序的):

>>> sorted(di.items()) 
[('one', 1), ('three', 3), ('two', 2)] 

注意,元組字典順序排序 - 通過在第一文本元組的元素。這相當於一系列元組的t[0]

假設您希望它按數字排序。你會使用一個key功能:

>>> sorted(di.items(), key=lambda t: t[1]) 
[('one', 1), ('two', 2), ('three', 3)] 

你有sorted(aDict.items(), key=lambda _: _[0])的聲明就使用_作爲變量名。它也什麼也不做,因爲aDict.items()產生元組,並且如果你沒有使用一個鍵,它就會按照元組的第一個元素排序。你的例子中的關鍵功能是完全無用的。

可能有一個表單的用例(元組除外)要考慮。如果你有字串,那麼你會被第一個字符排序和忽略其它:

>>> li=['car','auto','aardvark', 'arizona'] 
>>> sorted(li, key=lambda c:c[0]) 
['auto', 'aardvark', 'arizona', 'car'] 

Vs的:

>>> sorted(li) 
['aardvark', 'arizona', 'auto', 'car'] 

我仍然不會在lambda使用_但是。 _的使用是針對一個有副作用機率很小的throway變量。 Python的命名空間大多令人擔心並不是真正的擔心。

考慮:

>>> c=22 
>>> sorted(li, key=lambda c:c[0]) 
['auto', 'aardvark', 'arizona', 'car'] 
>>> c 
22 

c值,因爲lambda內局部命名空間的保留。

然而(下的Python 2.x的但不是Python的3.x的)這可能是一個問題:

>>> c=22 
>>> [c for c in '123'] 
['1', '2', '3'] 
>>> c 
'3' 

所以(光)慣例使用_用於可變無論是在的情況下,成爲列表理解或元組擴展等,您不必擔心踐踏您的某個名字。該消息是:如果它被命名爲_,我並不關心它,只是在這裏...

2

在Python中,lambda用於創建一個匿名函數。你的例子中的第一個下劃線只是lambda函數的參數。在冒號(即功能簽名)之後,_[0]檢索變量_的第一個元素。

無可否認,這可能會令人困惑;您示例中的lambda組件可以重寫爲lambda x: x[0],結果相同。但是,通常情況下,Python中的下劃線變量名用於「一次性變量」。在這種情況下,這意味着我們在每個字典項目中唯一關心的事情就是關鍵。細微差別,也許。

+2

注意:_也被用作'gettext'或類似函數的別名來檢索用於國際化的消息。但那又是一個故事。但是,下劃線會影響另一個,因此最好使用「真實」變量名稱。 –

2

在Python中_(下劃線)是一個有效的標識符,可用作變量名稱,例如,

>>> _ = 10 
>>> print(_) 
10 

它因此也可以使用作爲參數傳遞給lambda表達式的名稱 - 它就像一個未命名的函數。

在你的例子中sorted()aDict.items()生成的元組傳遞給它的key函數。鍵函數返回該元組的第一個元素,然後sorted()用作鍵,即該值與其他值進行比較以確定順序。

注意,在這種情況下,可以不用鑰匙的功能,因爲元組是按照第一個元素,則第二元件等,所以

sorted(aDict.items()) 

會產生自然排序產生相同的結果相同的結果。由於字典不能包含重複鍵,每個元組的第一個元素是唯一的,所以第二個元素在排序時從不考慮。