python-3.x 如何在不使用pop()的情况下从列表中取出pop()?

whhtz7ly  于 2023-03-04  发布在  Python
关注(0)|答案(3)|浏览(148)

我有一个名为pop_item()的函数,我试图让它像pop()一样与list类一起工作,我该怎么做呢?下面是我的代码:定义为空(第一次):返回列表== []

def pop_item(lst):
    lst = lst[::-1]
    new_lst = []
    for i in lst:
        if i != lst[-1]:
            new_lst += [i]
    lst = new_lst
    return lst

def main():
    todo = [1,2,3,4]

    print(todo) #prints [1,2,3,4] as expected

    print('\n' + 75 * '_' + '\n')

    print(pop_item(todo)) #pop the item off
    print(todo) #output should then be [1,2,3]

if __name__ == '__main__':
    main()

注意:我不允许使用任何内置函数,如len(),index,del()等。

ttcibm8c

ttcibm8c1#

比列表组件和宽切片效率更高的是使用单个条目切片赋值:

def pop_item(lst, index=-1):  # index is -1 by default so it pops from the end
    obj = lst[index]          # Save off the object being popped to return it
    lst[index:index+1 or None] = ()  # Remove it from the list
    return obj                # Return the saved off object to the caller

lst[index:index+1 or None] = ()等价于del lst[index],除了从不抛出异常;幸运的是,前一行的索引操作将为我们抛出异常。
del版本本质上是list.pop的实现方式,它分摊了O(1)的工作(当index是默认的-1时),以及当从list中的其他位置弹出时执行单个O(n)操作(与分片和列表组件相反,无论从何处弹出,分片和列表组件都涉及多个O(n)浅拷贝操作)。
您的原始代码与list.pop的不同之处在于:
1.它是根据值而不是索引删除的
1.它可以删除多个项目,而不仅仅是一个
1.它毫无理由地颠倒了输入
1.它保持输入不变,而不是从调用者的list中删除一个项
1.它返回输入list的变异副本,而不是弹出的项
替代品没有这些问题,并且与list.pop的行为基本相同。

plupiseo

plupiseo2#

下面是不使用list函数,只使用切片和列表解析从列表中弹出项的一些变体
使用slicing & slicing赋值弹出最后一项:

def pop_item(lst):
    lst[:] = lst[:-1]

通过重建列表弹出一个有值项(最后一个,但可以是参数)& slice assign

def pop_item(lst):
    lst[:] = [x for x in lst if x!=lst[-1]]

(that可以弹出列表中具有相同值的其他项)
通过指定列表中的项目位置/索引:

def pop_item(lst,item_position):
    lst[:] = [x for i,x in enumerate(lst) if i!=item_position]
1dkrff03

1dkrff033#

li= [1,2,3,4]
def popl(li)
 li=li[1:]
popl(li)
print(li)

相关问题