根据Python中单独列表中键的顺序,按键对字典列表进行排序

时间:2013-03-07 20:00:44

标签: python sorting dictionary

我有一个字典列表,看起来像这样:

[
    {
        "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"
    }
]

有没有人对如何实现这一点有任何建议?我很难搞清楚如何进行这种排序。

2 个答案:

答案 0 :(得分: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']])

答案 1 :(得分:3)

如果l是您的词典列表,那么

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

应该做的伎俩。读一下:

  

key是在给定的dict code中查找d的函数,然后在code_order中检查该代码的索引,因此最终排序是由那些指数。

(如果code_order变得非常大,那么请记住list.index需要线性时间,所以你最好用dict替换它。但对于这个短code_order,它应该没有没关系。)