我有一个不可变对象的列表,需要使用属性作为键来对其进行排序。
对象需要按照预先指定的顺序,而不是简单的升序/降序。
我已经编写了一些代码来做到这一点,但是我对在大型列表(其中“大型”完全是任意的)上的性能表现没有很大的信心。今天的用例只是小清单(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>)
假设“ pk”代表“主键”,那么您不必使用此类对象的列表(具有O(n)成员资格),而只需使用dict(具有O(1)成员)
objects = [Demo(x) for x in range(10)]
objects = {x: Demo(x) for x in range(10)}