4 回答

TA贡献1854条经验 获得超8个赞
不要使用列表。
列表只能在其末尾快速插入和删除项目。你会使用pop(-1)
and append
,你最终会得到一个堆栈。
相反,请使用collections.deque
,它专为在两端进行高效添加和删除而设计。在双端队列的“前端”工作使用popleft
andappendleft
方法。请注意,“deque”的意思是“双端队列”,发音为“deck”。

TA贡献1963条经验 获得超6个赞
L = [1, 2, 3]
L.pop() # returns 3, L is now [1, 2]
L.append(4) # returns None, L is now [1, 2, 4]
L.insert(0, 5) # returns None, L is now [5, 1, 2, 4]
L.remove(2) # return None, L is now [5, 1, 4]
del(L[0]) # return None, L is now [1, 4]
L.pop(0) # return 1, L is now [4]

TA贡献1773条经验 获得超3个赞
我为您运行了一些基准测试。这是结果。
TL;DR 您可能想使用deque. 否则,insert/append或pop/del都可以。
添加到最后
from collections import deque
import perfplot
# Add to end
def use_append(n):
"adds to end"
a = [1,2,3,4,5,6,7,8,9,10]*n
a.append(7)
return 1
def use_insert_end(n):
"adds to end"
a = [1,2,3,4,5,6,7,8,9,10]*n
a.insert(len(a),7)
return 1
def use_add_end(n):
"adds to end"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = a + [7]
return 1
perfplot.show(
setup=lambda n: n, # or simply setup=numpy.random.rand
kernels=[
lambda a: use_append(a),
lambda a: use_insert_end(a),
lambda a: use_add_end(a),
],
labels=["use_append", "use_insert_end", "use_add_end"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
)
从末尾删除
# Removing from the end
def use_pop(n):
"removes from end"
a = [1,2,3,4,5,6,7,8,9,10]*n
a.pop()
return 1
def use_del_last(n):
"removes from end"
a = [1,2,3,4,5,6,7,8,9,10]*n
del(a[-1])
return 1
def use_index_to_end(n):
"removes from end"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = a[:-1]
return 1
perfplot.show(
setup=lambda n: n,
kernels=[
lambda a: use_pop(a),
lambda a: use_del_last(a),
lambda a: use_index_to_end(a),
],
labels=["use_pop", "use_del_last", "use_index_to_end"],
n_range=[2 ** k for k in range(20)],
xlabel="len(a)",
)
添加到开头
# Add to beginning
def use_insert(n):
"adds to beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
a.insert(0,7)
return 1
def use_deque_appendleft(n):
"adds to beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = deque(a)
a.appendleft(7)
return 1
def use_add_start(n):
"adds to beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = [7] + a
return 1
perfplot.show(
setup=lambda n: n, # or simply setup=numpy.random.rand
kernels=[
lambda a: use_insert(a),
lambda a: use_deque_appendleft(a),
lambda a: use_add_start(a),
],
labels=["use_insert", "use_deque_appendleft","use_add_start"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
)
从头开始删除
# Remove from beginning
def use_del_first(n):
"removes from beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
del(a[0])
return 1
def use_deque_popleft(n):
"removes from beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = deque(a)
a.popleft()
return 1
def use_index_start(n):
"removes from beginning"
a = [1,2,3,4,5,6,7,8,9,10]*n
a = a[1:]
return 1
perfplot.show(
setup=lambda n: n, # or simply setup=numpy.random.rand
kernels=[
lambda a: use_del_first(a),
lambda a: use_deque_popleft(a),
lambda a: use_index_start(a),
],
labels=["use_del_first", "use_deque_popleft", "use_index_start"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
)

TA贡献1859条经验 获得超6个赞
您可以使用 python 列表对象的插入方法。
l = [1, 2, 3]
#lets insert 10 at biggining, which means at index 0
l.insert(0, 10)
print(l) # this will print [10, 1, 2, 3]
添加回答
举报