我有一个清单
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)解决方案。寻找更好的解决方案。
答案 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[..]
来阻止KeyError
中order
发生错误的情况{。}}。