2014-11-04 71 views
-1

我有一個字典列表,其值存儲爲字符串。我想通過將值作爲整數而不是字符串來對它們進行排序。 代碼,我通過將字符串的整數值存儲爲字符串來對字典列表進行排序

XWordDict=[{"name":"ABC","pos":"1"},{"name":"GHI","pos":"10"},{"name":"DEF","pos":"2"}] 
Xlistsorted=sorted(XWordDict,key=(operator.itemgetter("pos"))) 

這一聲令下如

[{'name': 'ABC', 'pos': '1'}, {'name': 'GHI', 'pos': '10'}, {'name': 'DEF', 'pos': '2'}] 

但是我想這是

[{'name': 'ABC', 'pos': '1'}, {'name': 'DEF', 'pos': '2'}, {'name': 'GHI', 'pos': '10'}] 

如果我改變

Xlistsorted=sorted(XWordDict,key=int(operator.itemgetter("pos))) 

它提供了一個錯誤

TypeError: int() argument must be a string or a number, not 'operator.itemgetter' 
+0

如果你想要訂單使用OrderedDict,你也不能有重複的鍵 – 2014-11-04 00:14:27

+1

你的示例字典是無效的Python代碼,嘗試將人們可以輕鬆複製粘貼到控制檯中的東西(通過複製粘貼到*你的控制檯)。 – Marius 2014-11-04 00:15:25

回答

6

key參數需要是一個函數。 operator.itemgetter(i)返回一個函數,但爲了增加額外的處理,你必須使用lambda。由於itemgetter返回功能,可以調用的結果來使用它的字典(你是路過的x在lambda:

listsorted = sorted(XWordDict, key=lambda x: int(operator.itemgetter("pos")(x))) 
listsorted 
Out[16]: 
[{'name': 'ABC', 'pos': '1'}, 
{'name': 'DEF', 'pos': '2'}, 
{'name': 'GHI', 'pos': '10'}] 

這就是說,itemgetter可能這裏是一個過於複雜的解決方案,可以只是做:

listsorted = sorted(XWordDict, key=lambda x: int(x['pos'])) 
+0

'x.get('pos',0)'會更好,以防字典中不存在'pos''。 – 2014-11-04 07:34:15

2

的參數排序()的‘關鍵’的關鍵字是一元函數,返回要排序的實際值所以你需要一個列表中的每個元素轉換函數(。我們將調用的字典d)訪問要排序的值,並將其從字符串轉換爲整數河

def dict_to_int(d): 
    string_value = d['pos'] 
    int_value = int(string_value) 
    int_value 

希望此它傳遞給排序():

sorted_list = sorted(list_of_dicts, key=dict_to_int) 

此函數是一個詳細例子,並且可以顯著縮短,並轉換爲一個相當簡潔拉姆達:

lambda d: int(d['pos']) 

和因此用於:

sorted_list = sorted(list_of_dicts, key=lambda d: int(d['pos'])) 
相關問題