首页 > 解决方案 > 将项目插入 Python 列表中的特定索引时,幕后是什么?

问题描述

我从这个答案中了解到,在索引处插入项目的最快方法是这样的:

a = [1, 2, 3, 4, 5]
a[2:2] = ["12345"]

但我不知道为什么。我从这个答案中了解到,复杂性永远不会是 O(1)。

我尝试了以下并验证了它应该大于 O(1) 的说法。

python3 -m timeit --setup="a = list(range(1000))" "a[500:500] = [3]"
50000 loops, best of 5: 3.89 usec per loop

python3 -m timeit --setup="a = list(range(100000))" "a[500:500] = [3]"
10000 loops, best of 5: 20.1 usec per loop

python3 -m timeit --setup="a = list(range(1000000))" "a[500:500] = [3]"
1000 loops, best of 5: 340 usec per loop

我认为我们可以在 O(1) 中确定地址/指针,然后我们只需将该地址指向新项目,它将是 O(1)。我认为我应该是错的,因为这会跳过右侧项目的地址。

我试图看看是什么,a[2:2]但结果只是一个空列表。我认为可以将索引和分配分开。我的意思是我们是否可以先获取特定索引的指针,然后让它指向一个新项目?

In [14]: a = [1, 2, 3, 4, 5]
In [15]: b = a[2:2]
In [16]: b = ["12345"]
In [17]: b
Out[17]: ['12345']
In [18]: a
Out[18]: [1, 2, 3, 4, 5]
In [19]: a[2:2] = ["12345"]
In [20]: a
Out[20]: [1, 2, '12345', 3, 4, 5]

在上面的代码中,我想通过 获取指针b=a[2:2],然后将其重定向到新项目"12345"b = ["12345"]

引擎盖下发生了什么?任何建议将不胜感激。提前致谢。

标签: pythonpython-3.xlisttime-complexity

解决方案


a[2:2] = [123] 意味着从第二个索引到第二个索引的空列表被分配给一个非空列表,该列表将从此填充该空间。

还有其他方法可以在列表中插入元素。最常见和最直接的方法之一是list.insert(index, element).


推荐阅读