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

问题描述 投票:0回答:3

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

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

有人对如何实现这一目标有任何建议吗?我很难弄清楚如何进行这种排序。

python list dictionary sorting key
3个回答
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']])

3
投票

如果

l
是你的字典列表,那么

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

应该可以解决问题。读作:

key
是在给定字典
code
中查找
d
的函数,然后在
code_order
中检查该代码的索引,因此最终排序是通过这些索引进行的。

(如果

code_order
变得非常大,那么请记住
list.index
需要线性时间,所以你最好用字典替换它。但是对于这个短的
code_order
,它应该无关紧要。)


0
投票

您可以使用

person_list
name_order
进行排序,如下所示:

person_list = [
  {'name':'Bob','age':18}, {'name':'Kai','age':36}, {'name':'Ada','age':24} 
]

name_order = ['Kai', 'Ada', 'Bob']

print(sorted(person_list, key=lambda x: name_order.index(x['name'])))

输出:

[
  {'name':'Kai', 'age':36}, {'name':'Ada', 'age':24}, {'name':'Bob','age':18}
]
© www.soinside.com 2019 - 2024. All rights reserved.