Python 根据显式定义的键顺序对字典列表进行排序

Python 根据显式定义的键顺序对字典列表进行排序,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我有一本字典的清单,例如: names = [{'Mark':'Volvo'}, {'John':'BMW'}, {'Eliza':'Merci'}, {'Calen':'Audi'}] 我想通过字典的键名来设置显式排序 例如,如果我下此订单: >>> order = ['John', 'Mark', 'Calen', 'Eliza'] ['John'、'Mark'、'Calen'、'Eliza'] 预期产出将是: [{'John':'BMW'},{'Mark':'Volv

我有一本字典的清单,例如:

names = [{'Mark':'Volvo'}, {'John':'BMW'}, {'Eliza':'Merci'}, {'Calen':'Audi'}]

我想通过字典的键名来设置显式排序

例如,如果我下此订单:

>>> order = ['John', 'Mark', 'Calen', 'Eliza']
['John'、'Mark'、'Calen'、'Eliza']

预期产出将是:

[{'John':'BMW'},{'Mark':'Volvo'},{'Calen':'Audi'},{'Eliza':'Merci'}]

我想添加一个自定义逻辑顺序。根据我定义的名称顺序,通过模板按名称显示。

首先,如果您的词典只有一个条目,元组似乎是此数据的更好选择:

>>> names = [('Mark', 'Volvo'), ('John', 'BMW'), ('Eliza', 'Merci'), ('Calen', 'Audi')]
现在,根据这个命令:

>>> order = ['John', 'Mark', 'Calen', 'Eliza']
您可以创建将名称映射到索引的dict:

>>> order_map = { k: v for v, k in enumerate(order) }
>>> order_map
{'John': 0, 'Mark': 1, 'Calen': 2, 'Eliza': 3}
并在排序的键函数中使用它:

>>> names.sort(key=lambda v: order_map[v[0]])
>>> names
[('John', 'BMW'), ('Mark', 'Volvo'), ('Calen', 'Audi'), ('Eliza', 'Merci')]
它按顺序遍历已排序的关键字,并提取dict列表中具有该关键字的任何名称。

类似于:由于
名称
是一个字典列表,每个字典只有一个键值对,因此使用
顺序
列表中人名的
索引
作为排序关键字:

>>> names = [{'Mark': 'Volvo'}, {'John': 'BMW'}, {'Eliza': 'Merci'}, {'Calen' :'Audi'}]
>>> order = ['John', 'Mark', 'Calen', 'Eliza']
>>>
>>> # with `sorted()`
>>> sorted(names, key=lambda d: order.index(list(d.keys())[0]))
[{'John': 'BMW'}, {'Mark': 'Volvo'}, {'Calen': 'Audi'}, {'Eliza': 'Merci'}]
>>>
>>> # or with `list.sort()`
>>> names.sort(key=lambda d: order.index(list(d.keys())[0]))
>>> names
[{'John': 'BMW'}, {'Mark': 'Volvo'}, {'Calen': 'Audi'}, {'Eliza': 'Merci'}]
dict.keys()
不可订阅,因此
dict.keys()[0]
不起作用。因此,首先将其转换为列表,然后使用其唯一的键
list(dict.keys())[0]
。这将给出“Mark”、“John”等,然后在
顺序中获得该人姓名的索引。注意:如果某个人未在
订单中列出,则该操作将失败

即使
names
是一个字典列表,每个字典都有多个键值对,只要人的名字是第一个键,它仍然可以在Python 3.7/3.6中使用。见:

在版本3.7中更改:字典顺序保证为插入顺序。此行为是3.6中CPython的一个实现细节


这个订单的逻辑是什么?或者订单是作为列表单独提供的,如
['John','Mark',…]
['BMW','Volvo']
?“我想手动设置明确的订单”请您详细说明一下这一点好吗?我想补充一点,只有当所有的dict都只有一个元素时,答案才是明确的,您可能需要澄清。如果是这样,最好将数据存储为单个dict({str:str}如果每个键有一个值,或者{str:[str]}如果某些键有多个值)。然后,应该回答您的问题。是的,dict只有一个元素。您可以使用
result=sorted(tuples,key=lambda t:(len(t[0]),t[0])
对元组进行排序,其中
tuples=[(k,v)代表d中的d,tuples=[(k,v)代表d中的d,v.items()][/code>。
>>> names = [{'Mark': 'Volvo', 'age': 30},
...          {'John': 'BMW', 'age': 40},
...          {'Eliza': 'Merci', 'age': 50},
...          {'Calen': 'Audi', 'age': 60}]
>>> sorted(names, key=lambda d: order.index(list(d.keys())[0]))
[{'John': 'BMW', 'age': 40}, {'Mark': 'Volvo', 'age': 30}, {'Calen': 'Audi', 'age': 60}, {'Eliza': 'Merci', 'age': 50}]
>>>