排序提供订单的字典列表

时间:2016-01-29 06:31:59

标签: python list sorting dictionary

我有一个清单

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

和词典列表

list_of_dct = [{'value':11}, {'value':8}, {'value':5}, {'value':7}, {'value':10}, {'value':9}]

我想按list_of_dct列表中给出的顺序对此order进行排序,即输出应如下:

list_of_dct = [{'value':8}, {'value':7}, {'value':5}, {'value':9}, {'value':10}, {'value':11}]

我知道如何按给定的key排序,但不知道订单已经给出。我该如何排序?

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

2 个答案:

答案 0 :(得分:5)

使用order列表的索引进行排序 - 只要尝试每个字典都有一个值,并且您希望按该值排序 -

sorted(list_of_dct,key=lambda x:order.index(x.values()[0]))

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

答案 1 :(得分: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[..]来阻止KeyErrororder发生错误的情况{。}}。