为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2022-12-20 12:20:04
在 Python 中,我如何编写代码来移出列表的最后一个元素并在开头添加一个新元素 - 以便在执行时尽可能快地运行?有一些很好的解决方案涉及使用追加、旋转等,但并非所有解决方案都可以转化为快速执行。
查看完整描述

4 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

不要使用列表。

列表只能在其末尾快速插入和删除项目。你会使用pop(-1)and append,你最终会得到一个堆栈。

相反,请使用collections.deque,它专为在两端进行高效添加和删除而设计。在双端队列的“前端”工作使用popleftandappendleft方法。请注意,“deque”的意思是“双端队列”,发音为“deck”。


查看完整回答
反对 回复 2022-12-20
?
神不在的星期二

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]


查看完整回答
反对 回复 2022-12-20
?
慕容3067478

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)",

)

//img1.sycdn.imooc.com//63a1382000013fab05310289.jpg

从末尾删除

# 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)",

)

//img1.sycdn.imooc.com//63a138300001a8e805360296.jpg

添加到开头

# 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)",

)

//img1.sycdn.imooc.com//63a1383c00018c9b05710289.jpg

从头开始删除

# 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)",

)

//img1.sycdn.imooc.com//63a1384b0001e3bb05490284.jpg

查看完整回答
反对 回复 2022-12-20
?
BIG阳

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]


查看完整回答
反对 回复 2022-12-20
  • 4 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号