2013-03-05 65 views
0

我是新來的蟒蛇,我試圖整理的元組下面的列表裏的關鍵功能:寫排序功能

>>> str 
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')] 

我想它的基礎上的元組的第一個值,但不幸的是,排序每個元組的第一個值是一個字符串,而不是一個整數。我知道我可以創建一個做到這一點的關鍵功能:

def digit_key(t): 
    return (int(t[0])) 

,然後調用排序是這樣的:

>>> sorted(str,key=digit_key) 
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')] 

難道我一直都在排序前定義按鍵功能? 有沒有一種更漂亮的方式來編寫這段代碼而不定義兩個函數呢? 我嘗試以下和失敗:

>>> sorted(str,key= int(str[0][0])) 
Traceback (most recent call last): 
    File "<pyshell#1112>", line 1, in <module> 
    sorted(str,key= int(str[0][0])) 
TypeError: 'int' object is not callable 
+2

你想用'str [0] [0]'做什麼? - 作爲一個側面說明,'str'是一個內建類型。你可能會最好把你的變量命名爲其他:) – mgilson 2013-03-05 21:58:32

+0

謝謝....我將在未來保持這一點:) – tomkaith13 2013-03-05 22:00:14

+0

有'digit_key'作爲命名函數有什麼問題?如果你想在多個地方使用它,單元測試它,請求幫助調試它,在6個月後自己調試它,你會很高興你已經將它定義爲一個單獨的函數。而且所有的代價都是一行浪費的代碼。這真的不能接受嗎? – abarnert 2013-03-05 22:07:18

回答

2

你可以這樣做:

sorted(str,key=lambda x: int(x[0])) 

lambda創建一個內聯函數,相當於(在這種情況下,至少)到您的digit_key。我不確定這是否「更漂亮」,但它不那麼冗長,是大多數人可能會用到的。

+2

如果關鍵func不重要,它應該寫成一個命名函數,以便您可以對它進行單元測試。 – 2013-03-05 21:59:29

+0

@gnibbler - 當然。 'lambda'對於複雜的函數是毫無價值的。 – mgilson 2013-03-05 22:03:39

2

是的。 Lambda語句:

sorted(str, key= lambda a: (int(a[0]))) 

基本上它是一種簡潔的方式來聲明內聯函數。語法是lambda關鍵字後面的參數(用逗號分隔),一個冒號,然後該函數返回的語句:

lambda <arg...> : <statement> 
2

如果你真的想避免定義功能,lambda沒有幫助;這只是定義函數的一種不同方式。您可以使用高階函數而不定義它們來創建功能:

sorted(str, key=functional.compose(int, operator.itemgetter(0))) 

(你需要安裝functional模塊(或compose功能的其他來源),以及importfunctionaloperator

但是我認爲這是對「define」的定義作弊,它肯定不是更pythonic。同時,如果你只是想要最漂亮,最pythonic或最可維護的代碼......也許你已經知道了。

賦予函數名稱通常會使其更具可讀性。

這也使得它更容易調試。如果lambda foo: bar(baz(foo), qux(foo))沒有做正確的事情,那麼您必須嘗試猜測假設在修復之前應該做的事。如果這個函數有一個名字,你不必猜測 - 它應該是做名字所暗示的。

定義它也意味着你可以在多個地方使用它,而無需複製粘貼。

你可以單元測試它。

而且它通常更高效。

所有它的成本你是一行浪費的代碼。這真的不能接受嗎?

很明顯,在足夠簡單的情況下,lambda通常是可讀的,否則它不會在語言中處於第一位。但它從來沒有實際的必要,並且總是在簡潔和明確之間進行權衡。