![](/img/trans.png)
[英]Python how to sort list of objects based on their attribute according to another list
[英]Sort a list of objects according to a property in another list
我的数据由具有某些属性( pk
)的对象组成:
obj0.pk = 'aa'
obj1.pk = 33
ojb2.pk = 'm0'
我有一堆无序对象:
data = [obj0, obj1, obj2]
我有pk列表,用于指定如何订购对象:
pks = [33, 'aa', 'm0']
现在,我调用一个函数来排序数据:
output = sort_data_by_pk(data, pks)
预期产量:
[obj1, obj0, obj2]
我们如何在python中实现sort_data_by_pk
?
我最初的实现是:
def sort_data_by_pk(data, pks):
lookup = {instance.pk: instance for instance in data}
return [lookup[pk] for pk in pks]
使用index
方法作为关键函数不必要地使解决方案的平均时间复杂度为O(n ^ 2 log n)而不是O(n log n) 。
相反,您可以构建一个将data
的项目映射到其索引的字典,以便可以使用该字典将对象的pk
属性映射为排序顺序的关键功能:
order = {k: i for i, k in enumerate(pks)}
output = sorted(data, key=lambda o: order[o.pk])
您可以根据pks
的index
sort
data
进行sort
,例如,
>>> pks = [33, 'aa', 'm0']
>>> data = [ob0, ob1, ob2]
>>>
>>>
>>> sorted(data, key=lambda x: pks.index(x.pk))
[<__main__.Obj object at 0x7f03851cc290>, <__main__.Obj object at 0x7f03851cc250>, <__main__.Obj object at 0x7f03851cc2d0>]
我认为您想使用带lambda的sorted
来获取pks
主键的索引。
sorted_data = sorted(data, lambda d: pks.index(d.pk))
如果列表很大,则可能要先创建一个dict,以避免在列表上多次调用“ index”。
pks = [33, 'aa', 'm0']
data = [ob0, ob1, ob2]
d = { obj.pk: obj for obj in data } #lookup table for pks
sorted_list = [ d[pk] for pk in pks ] #create a new list out of list "pks" where pk is replaced by the value in the lookup table
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.