在 Python 中推送和弹出列表的最有效方法是什么?

在 Python 中,我如何编写代码来移出列表的最后一个元素并在开头添加一个新元素 - 以便在执行时尽可能快地运行?

有一些很好的解决方案涉及使用追加、旋转等,但并非所有解决方案都可以转化为快速执行。


青春有我
浏览 198回答 4
4回答

哔哔one

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

神不在的星期二

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]

慕容3067478

我为您运行了一些基准测试。这是结果。TL;DR 您可能想使用deque. 否则,insert/append或pop/del都可以。添加到最后from collections import dequeimport perfplot# Add to enddef use_append(n):    "adds to end"    a = [1,2,3,4,5,6,7,8,9,10]*n    a.append(7)    return 1def 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 1def use_add_end(n):    "adds to end"    a = [1,2,3,4,5,6,7,8,9,10]*n    a = a + [7]    return 1perfplot.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 enddef use_pop(n):    "removes from end"    a = [1,2,3,4,5,6,7,8,9,10]*n    a.pop()    return 1def use_del_last(n):    "removes from end"    a = [1,2,3,4,5,6,7,8,9,10]*n    del(a[-1])    return 1def use_index_to_end(n):    "removes from end"    a = [1,2,3,4,5,6,7,8,9,10]*n    a = a[:-1]    return 1perfplot.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 beginningdef use_insert(n):    "adds to beginning"    a = [1,2,3,4,5,6,7,8,9,10]*n    a.insert(0,7)    return 1def 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 1def use_add_start(n):    "adds to beginning"    a = [1,2,3,4,5,6,7,8,9,10]*n    a = [7] + a    return 1perfplot.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 beginningdef use_del_first(n):    "removes from beginning"    a = [1,2,3,4,5,6,7,8,9,10]*n    del(a[0])    return 1def 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 1def use_index_start(n):    "removes from beginning"    a = [1,2,3,4,5,6,7,8,9,10]*n    a = a[1:]    return 1perfplot.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)",)

BIG阳

您可以使用 python 列表对象的插入方法。l = [1, 2, 3]#lets insert 10 at biggining, which means at index 0l.insert(0, 10)print(l) # this will print [10, 1, 2, 3]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python