Python-按对象属性对列表进行排序,并按第二个列表提供的顺序…是否可以改进?

问题描述 投票:0回答:2

我有一个不可变对象的列表,需要使用属性作为键来对其进行排序。

对象需要按照预先指定的顺序,而不是简单的升序/降序。

我已经编写了一些代码来做到这一点,但是我对在大型列表(其中“大型”完全是任意的)上的性能表现没有很大的信心。今天的用例只是小清单(12件或更少),但是我活了很久,一直期望最终会有一大笔被扔掉。

我是否可以利用其他方法,库或快捷方式来使此操作更有效?

# setup
class Demo(object):
    def __init__(self, pk):
        self.pk = pk

    def __repr__(self):
        return f'<Demo: {self.pk}>'

objects = [Demo(x) for x in range(10)]
ordinality = [9, 0, 8, 4, 5, 1, 3, 7, 6, 2]

# operation in question
result = (next(obj for obj in objects if obj.pk == ordinal) for ordinal in ordinality)

print(tuple(result))
>>> (<Demo: 9>, <Demo: 0>, <Demo: 8>, <Demo: 4>, <Demo: 5>, <Demo: 1>, <Demo: 3>, <Demo: 7>, <Demo: 6>, <Demo: 2>)
python sorting
2个回答
0
投票

假设“ pk”代表“主键”,那么您不必使用此类对象的列表(具有O(n)成员资格),而只需使用dict(具有O(1)成员)

objects = [Demo(x) for x in range(10)]

objects = {x: Demo(x) for x in range(10)}
© www.soinside.com 2019 - 2024. All rights reserved.