2015-10-09 28 views
2

我有我想排序的字典對象列表(從csv讀取)。例如。Python自定義排序

l_data.sort(key=lamdba x: (x['fname'], x['lname'])) 

現在我想使代碼更靈活,要根據輸入的排序上的按鍵,是這樣的:

def sort_data(l_data, keys): 
    l_data.sort(key=lambda x: (x[d] for d in keys)) 
    ... ... 

而且我得到以下錯誤:

TypeError: unorderable types: generator() < generator() 

回答

3

(x[d] for d in keys)是一個生成器表達式(產生generator對象)。如果你想使一個元組,換行發電機表達tuple(...)

def sort_data(l_data, keys): 
    l_data.sort(key=lambda x: tuple(x[d] for d in keys)) 
    # code 

雖然你的代碼可以大大簡化使用operator.itemgetter

from operator import itemgetter 

def sort_data(l_data, keys): 
    l_data.sort(key=itemgetter(*keys)) 
    # code 
+1

謝謝! itemgetter真的是pythonic! – fivelements

0

您正試圖通過發電機x[d] for d in keys進行排序時,生成器的輸出需要首先轉換爲元組。

請參閱here