2015-07-20 103 views
0

我將字典逐個插入列表中。最終,我正在按字典的兩個值排序列表。有沒有一種方法可以在插入新詞典的同時進行排序而不是在最後進行排序?是否有一個內置的包或方法可以讓我這樣做,因此每一個新的字典都是正確的?在列表中訂購字典

+3

['bisect.insort()']( https://docs.python.org/2/library/bisect.html#bisect.insort),也許 – NightShadeQueen

+1

你有沒有嘗試過?我沒有Python經驗,但通常字典不能保證順序排列,除非文檔明確說明。 –

+0

雖然我建議反對。 'bisect.insort'將會是O(n^2)最差的情況,因爲你必須在插入點之後移動所有東西。最後排序是O(nlogn)。 – NightShadeQueen

回答

0

您可以使用heapq模塊,其中包含優先級隊列實現(在插入新項目時保留有序列表)。這個模塊的麻煩是,它不允許你提供一個插入數據的比較函數。我們可以通過將heapq.heappush一個元組與所述第一和第二密鑰和字典克服這種限制,我們想存儲:

def make_tup(d): 
    return (d['keyA'], d['keyB'], d) 

實例:

# Create tuples and add it to the heap queue 
ls = [] 
heapq.heappush(ls, make_tup(dict(keyA=10, keyB=5, c=20))) 
heapq.heappush(ls, make_tup(dict(keyA=5, keyB=13, c=5))) 
# Iterate over sorted items 
for key_a, key_b, value in ls: 
    print value