簡體   English   中英

根據另一個列表中的屬性對對象列表進行排序

[英]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])

您可以根據pksindex 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM