为了插入到嵌套列表

use*_*376 3 python nested-lists

假设我有一个类似的嵌套列表:

nested_list=[[123,'Aaron','CA'],[124,'Bob','WY'],[125,'John','TX']]
insert_me=[122,'George','AL']
Run Code Online (Sandbox Code Playgroud)

该列表当前按每个子列表的中间值排序(按字母顺序),我想在嵌套列表中的正确位置添加值insert_me。为了保持字母顺序,需要在列表之间添加“ Bob”和“ John”的列表。我知道bisect通常将用于带有列表的此类任务,但不了解如何将bisect用于此类的嵌套列表。

ise*_*dev 5

请参阅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)
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下:

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']]
Run Code Online (Sandbox Code Playgroud)

为了避免keys每次都重新构建,请在其中也插入新值keys

keys.insert(bisect_left(keys,insert_me[1]),insert_me[1])
Run Code Online (Sandbox Code Playgroud)

更新:

在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
Run Code Online (Sandbox Code Playgroud)