2015-05-19 20 views
0

讓我們這個代碼爲例(按價值排序字典項):尋找一個更好的Python語法到多個參數傳遞給一個單參數化的λ

sorted(d.items(), key=lambda kv: kv[1]) 

鍵作爲單參數的定義仿函數決定了這個醜陋的lambda。

現在,this book我見過一些例子使用一個更加美好的語法,這樣的:

sorted(d.items(), key=lambda (k,v): v) 

但不幸的是,這給了我一個語法錯誤(在蟒蛇3.4)。

這樣的語法是否存在?在哪個版本?

+0

它工作在Python 2.7.6罰款;我想想知道爲什麼它不在Python 3 – Pynchia

回答

4

這是不幸的removed in Python3

:-(

當時的想法是,這阻礙了反省,而是盤算着如何的功能是通過簽名叫的,這需要分析字節碼(語法樹)。

2

在Python3 PEP3113除去功能

據我知道有沒有解決方法爲lambda情況下,你可以做到以下幾點:。

def f_unpack(f): 
    def unpacking(args): 
     return f(*args) 
    return unpacking 

然後使用f_unpack(lambda k, v: v)。 (您可能必須爲f_unpack找到一個更具描述性的名稱縮寫

3

更換完全拉姆達是用例的operator.itemgetter

sorted(d.items(), key=operator.itemgetter(1)) 
+0

你是對的,但我總覺得它違背了[zen](https://www.python.org/dev/peps/pep- 0080 /)thingy:「應該有一個,最好只有一個......」(引用來自內存)Lambdas是'itemgetter'的一個嚴格超集,對於一個特定的情況,還有''itemgetter''可能會更快) –

+2

那麼,'operator.itemgetter'是一個) –

+0

請記住''lambda'差不多從Python 3中移除了,因爲感覺有更好的解決方案('operatorgetter','attrgetter'和'operatorcaller'來自'operator'模塊; 'functools.partial'等)的大部分用例。 – chepner

相關問題