2016-06-28 91 views
1

我有一個已經按鍵id排序的字典列表。Python:插入新元素到排序的字典列表中

y = [{'id': 0, 'name': 'Frank'}, 
    {'id': 5, 'name': 'Hank'}, 
    {'id': 8, 'name': 'Fred'}, 
    {'id': 30, 'name': 'Jill'}] 

我想插入一個新元素到列表中。

y.append({'id': 6, 'name': 'Jenkins'}) 

如何避免在添加新元素後按如下方式重新排序列表?

y = sorted(y, key=lambda x: x['id']) 

理想的結果是:

y = [{'id': 0, 'name': 'Frank'}, 
    {'id': 5, 'name': 'Hank'}, 
    {'id': 6, 'name': 'Jenkins'}, 
    {'id': 8, 'name': 'Fred'}, 
    {'id': 30, 'name': 'Jill'}] 

編輯:

使用bisect.insort(y, {'id': 6, 'name': 'Jenkins'})將工作只爲第一項中,如果字典是按名稱排序,它將會失敗。

+0

幫你一個忙,並創建一個id和name屬性的類。然後,您可以通過\ _ \ _ cmp \ _ \ _方法提供適當的排序方法。 – guidot

+0

編輯完問題後,會添加一個全新的需求,對列表進行排序的字段是可變的。這更像是一個數據庫問題... – guidot

回答

3

既然a insertion in a list is in O(n)無論如何,任何聰明的二分法算法都沒有那麼有用,所以你可以簡單地循環列表來找到它應該插入的位置,然後插入它。類似於:

new_value = {'id': 6, 'name': 'Jenkins'} 

for index, value in enumerate(y): 
    # Assuming y is in increasing order. 
    if value['id'] > new_value['id']: 
     y.insert(index, new_value) 
     break 
+2

您可能希望確保至少在某處添加新值(可能在最後) – Wikunia