2013-03-07 68 views
2

一個單獨的列表的順序我有一個字典列表看起來像這樣的:排序字典的一個鍵,一個基於列表鍵Python中

[ 
    { 
     "format": "format1", 
     "code": "tr" 
    }, 
    { 
     "format": "format2", 
     "code": "hc" 
    }, 
    { 
     "format": "format3", 
     "code": "bx" 
    }, 
    { 
     "format": "format4", 
     "code": "mm" 
    }, 
    { 
     "format": "format5", 
     "code": "el" 
    } 
] 

我需要訂購基於此列表

code_order = ["mm", "hc", "el", "tr", "bx"] 

所以最終名單應該是這樣的:

[ 
    { 
     "format": "format4", 
     "code": "mm" 
    }, 
    { 
     "format": "format2", 
     "code": "hc" 
    }, 
    { 
     "format": "format5", 
     "code": "el" 
    }, 
    { 
     "format": "format1", 
     "code": "tr" 
    }, 
    { 
     "format": "format3", 
     "code": "bx" 
    } 
] 
012對碼鍵的值,但代碼的順序是由一個獨立的名單確定

有沒有人有關於如何實現這一目標的任何建議?我很難搞清楚如何做這種類型。

回答

4

Python的2.7+:

lookup = {s: i for i, s in enumerate(code_order)} 
print(sorted(l, key=lambda o: lookup[o['code']])) 

老年人:

lookup = dict((s, i) for i, s in enumerate(code_order)) 
print sorted(l, key=lambda o: lookup[o['code']]) 
+0

爲了擴大John的答案,創建查找字典並將其用作排序關鍵字是最有效的pythonic方法。如果你想排序現有的列表,而不是創建一個新的列表,那麼第二行變成l.sort(key = lambda o:lookup [o ['code']])。 – 2013-03-07 20:18:36

+0

@moreati,在這種情況下,我認爲最好是從查找字典開始,而不是將列表中的code_order轉換爲字典。我對此有控制,所以這很容易做到,在這種情況下,我只需要第二行。完善。這比我想要做的要簡單得多。 – 2013-03-07 21:05:44

3

如果l是你的類型的字典列表,然後

sorted(l, key=lambda d: code_order.index(d['code'])) 

應該做的伎倆。閱讀爲:

key是查找在給定的字典dcode功能,然後檢查代碼的指數code_order,所以最終的排序是由那些索引。

(如果code_order變得非常大,那麼請記住,list.index需要線性時間,所以你最好由一個字典替換它。但爲了這短暫code_order,它不應該的問題。)

+0

謝謝!我接受了約翰的答案,因爲它給了字典的方法,但謝謝你的解釋。 – 2013-03-07 21:07:34

相關問題