按照给定的顺序对字典列表进行排序

5

我有一个列表

order = [8, 7, 5, 9, 10, 11]

和一个字典列表
list_of_dct = [{'value':11}, {'value':8}, {'value':5}, {'value':7}, {'value':10}, {'value':9}]

我想按照order列表中的顺序对list_of_dct进行排序,即输出结果应为以下内容:
list_of_dct = [{'value':8}, {'value':7}, {'value':5}, {'value':9}, {'value':10}, {'value':11}]

我知道如何按照给定的key进行排序,但是当已经给出排序顺序时该怎么办呢?

备注:我已经有一个O(n^2)的解决方案了,正在寻找更好的解决方案。


value对于列表中的所有字典是否都是静态的,还是只是一个占位符?此外,order列表是否包含字典中存在的所有项,包括重复项? - Raunak Agarwal
1
与其执行一般排序,更有效的方法是构建一个包含值作为键的dict,然后仅从中按顺序提取条目。问题:(1)order中的每个值都已知存在于list_of_dct中吗?(2)相同的值是否可以在list_of_dct中出现多次? - Tom Karzes
2个回答

5
使用order列表的索引进行排序-仅当每个字典都只有一个值且您想按该值排序时,请尝试此方法。
sorted(list_of_dct,key=lambda x:order.index(x.values()[0]))

但是,如果您的一个键有多个值,则需要更改索引(即[0])来排序。


3
使用enumerate函数将8映射为0,7映射为1,...,11映射为5:
>>> order = [8,7,5,9,10,11]
>>> list_of_dct = [{'value':11}, {'value':8}, {'value':5},
                   {'value':7}, {'value':10}, {'value':9}]
>>> sort_keys = {item: i for i, item in enumerate(order)}
>>> sort_keys
{5: 2, 7: 1, 8: 0, 9: 3, 10: 4, 11: 5}

并将其用作排序关键字:

>>> list_of_dct.sort(key=lambda d: sort_keys.get(d['value'], len(sort_keys)))
>>> list_of_dct
[{'value': 8}, {'value': 7}, {'value': 5}, {'value': 9},
 {'value': 10}, {'value': 11}]

使用 sort_keys.get(..) 代替 sort_keys[..],以防止在 order 中的值缺失时出现 KeyError


2
因为字典查找只有O(1)的复杂度,所以我点赞了它。 - The6thSense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接