见例如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