gpt4 book ai didi

Python:有临时的pop方法吗?

转载 作者:行者123 更新时间:2023-12-04 08:52:59 26 4
gpt4 key购买 nike

有没有像 pop 这样的方法可以暂时删除列表中的元素,而不永久更改原始列表?
一个将执行以下操作:

  • 列表 = [1,2,3,4]
  • newpop(list, 0) 返回 [2,3,4]
  • 名单不变

  • 我来自 R,如果我想暂时删除某个列表的最后一个元素,我只会做 c(1,2,3,4)[-4] ,所以如果我在这里倒退,请原谅我。
    我知道我可以编写如下函数:
    def newpop(list, index):
    return(list[:index] + list[index+1 :]
    ,但似乎过于复杂?任何提示将不胜感激,我正在尝试学习更多的 Python 和更少的 R。

    最佳答案

    我可能认为“临时”有点过于文学化,但你可以定义一个 contextmanagerpop列表中的项目和 insert当你完成工作时它会回来 with列表:

    from contextlib import contextmanager

    @contextmanager
    def out(lst, idx):
    x = lst.pop(idx) # enter 'with'
    yield # in `with`, no need for `as` here
    lst.insert(idx, x) # leave 'with'

    lst = list("abcdef")
    with out(lst, 2):
    print(lst)
    # ['a', 'b', 'd', 'e', 'f']
    print(lst)
    # ['a', 'b', 'c', 'd', 'e', 'f']
    注意:这不会创建列表的副本。您在 with 期间对列表所做的所有更改将反射(reflect)在原始内容中,直到如果索引不再有效,将元素插入回列表可能会失败。
    另请注意,根据位置的不同,弹出元素然后将其放回列表的复杂度高达 O(n),因此从性能的角度来看,这也没有任何意义,除非您想节省内存关于复制列表。

    更类似于您的 newpop函数,而且可能更实用,您可以使用列表推导式 enumerate创建没有违规位置的列表副本。这不会创建两个临时切片,并且还可能更具可读性并且不太容易出现一对一错误。
    def without(lst, idx):
    return [x for i, x in enumerate(lst) if i != idx]

    print(without(lst, 2))
    # ['a', 'b', 'd', 'e', 'f']
    您也可以通过简单地更改 [...] 来更改它以返回生成器表达式。至 (...) ,即 return (x for ...) .这将是列表上的只读“ View ”,而无需创建实际副本。

    关于Python:有临时的pop方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63997993/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com