2015-06-17 166 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]) 
相關問題