の Python ドキュメントの例を参照してくださいbisect
。
sorted() 関数とは異なり、bisect() 関数がキーまたは逆の引数を持つことは意味がありません。これは、設計が非効率になるためです (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])
アップデート:
insert/bisect、append/sorted、および 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