2015-06-17 169 views
-1

这是一个令人困惑的标题。Python如何根据另一个列表根据它们的属性对对象列表进行排序

可以说我有标识

ids = [3, 1, 2, 4] 

的列表,我检索一气呵成的对象,例如在Django:

records = Record.objects.filter(id__in=ids) 

如何保持记录的顺序根据到另一个列表,雅致,最好使用内置的排序功能

我现在能想到的唯一的办法就是以最小的循环传统的代码,隐蔽记录先字典,然后依次通过的ID直接接在字典中的记录,见下图:

result = [] 
dict_of_records = {r.id: r for r in records} 
for id in ids: 
    result.append(dict_of_records[id]) 
+0

你是什么意思“建设排序“?谷歌显示没有相关的命中。 – user2357112

+0

是一个错字.....内置。 –

+0

可能是一种内置的方式。无论如何,一个简单的算法解决方案 - 你可以创建一个哈希表 - 键是id,值是记录。然后,只需遍历排序的键列表 – SomethingSomething

回答

0

就个人而言,我不会使用基于排序的解决方案:

,如果你预先计算排序关键,这将是更有效的。对于N个记录,排序会花费O(Nlog(N))时间,但我们可以在O(N)时间内解决问题。这就是说,一个排序是这样的:

positions = {j:i for i, j in enumerate(ids)} 
result = sorted(Record.objects.filter(id__in=ids), key=lambda r:positions[r.id]) 

我会做的是使用positions表把每个记录在它的最终位置立刻道:

result = [None]*len(positions) 
for record in Record.objects.filter(id__in=ids): 
    result[positions[record.id]] = record 
2

使用sorted(),并指定与key关键字ARG排序关键字:

sorted(records, key=lambda x: ids.index(x)) 

然而,这将是低效,因为它需要查找(ids.index(x))。

sortkey = {j:i for i,j in enumerate(ids)} 
sorted(records, key=lambda x: sortkey[x]) 
相关问题