見例如Python文檔在bisect
:
不像排序()函數,它沒有任何意義的平分線() 功能具有關鍵或逆轉的論點,因爲這會導致 效率低下的設計(連續調用平分函數不會 「記住」以前的所有鍵查找)。
相反,它是更好的搜索預先計算的鍵的列表中找到問題的 指數的紀錄:
>>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambda r: r[1])
>>> keys = [r[1] for r in data] # precomputed list of keys
>>> data[bisect_left(keys, 0)]
('black', 0)
>>> data[bisect_left(keys, 1)]
('blue', 1)
>>> data[bisect_left(keys, 5)]
('red', 5)
>>> data[bisect_left(keys, 8)]
('yellow', 8)
所以你的情況:
nested_list = [[123,'Aaron','CA'],[124,'Bob','WY'],[125,'John','TX']]
insert_me = [122,'George','AL']
keys = [r[1] for r in nested_list]
nested_list.insert(bisect.bisect_left(keys,insert_me[1]),insert_me)
[[123, 'Aaron', 'CA'],
[124, 'Bob', 'WY'],
[122, 'George', 'AL'],
[125, 'John', 'TX']]
爲了避免每次重建keys
,並在keys
中插入新值:
keys.insert(bisect_left(keys,insert_me[1]),insert_me[1])
更新:
難道插入/開張,追加/排序,heapq解決方案之間的一些性能比較:
# elements heapq insert/bisect append/sorted
10,000 0.01s 0.08s 2.43s
20,000 0.03s 0.28s 10.06s
30,000 0.04s 0.60s 22.81s
最終,如果您要執行大量插入操作,則樹可能是更好的數據結構。 – mgilson 2013-03-22 19:52:40