Сортировать список объектов по свойству в другом списке - PullRequest
0 голосов
/ 15 апреля 2019

Мои данные состоят из объектов с некоторым свойством (pk):

obj0.pk = 'aa'
obj1.pk = 33
ojb2.pk = 'm0'

У меня есть куча неупорядоченных объектов:

data = [obj0, obj1, obj2]

И у меня есть список ПК, которые указывают, как упорядочить объекты:

pks = [33, 'aa', 'm0']

Теперь я вызываю функцию для упорядочения данных:

output = sort_data_by_pk(data, pks)

Ожидаемый результат:

[obj1, obj0, obj2]

Как мы можем реализовать sort_data_by_pk в python?

EDIT

Моя первоначальная реализация:

def sort_data_by_pk(data, pks):
    lookup = {instance.pk: instance for instance in data}
    return [lookup[pk] for pk in pks]

Ответы [ 4 ]

3 голосов
/ 15 апреля 2019

Использование метода index в качестве ключевой функции излишне делает решение O (n ^ 2 log n) вместо O (n log n) в средней сложности времени.

Вместо этого вы можете создать dict, который отображает элементы в data на их индексы, так что вы можете использовать dict для сопоставления атрибута pk объектов в качестве ключевой функции для порядка сортировки:

order = {k: i for i, k in enumerate(pks)}
output = sorted(data, key=lambda o: order[o.pk])
2 голосов
/ 15 апреля 2019

Если ваши списки большие, вы, возможно, захотите сначала создать dict, чтобы избежать нескольких вызовов индекса в списке.

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
2 голосов
/ 15 апреля 2019

Я думаю, что вы хотите использовать sorted с лямбдой, которая получает индекс первичного ключа в pks.

sorted_data = sorted(data, lambda d: pks.index(d.pk))
2 голосов
/ 15 апреля 2019

Вы можете sort data на основе index в pks как,

>>> 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...