【问题标题】:Pop from a Python list with default value从具有默认值的 Python 列表中弹出
【发布时间】:2021-07-04 18:18:06
【问题描述】:

如果索引不存在,有没有办法用默认值从列表中弹出一个元素?我知道对于字典,python 允许 pop 函数返回一个默认值,如下所示:

d = {"stack": "overflow"}
d.pop("stack", 10) # returns "overflow"
d.pop("badkey", 10) # returns 10

列表是否有等价物?似乎python的默认列表弹出方法does not support default values那么实现下面代码sn-p所示功能的最pythonic方式是什么?

def pop_default(input_list, index, default_value):
    try:
        temp = input_list[index].copy()
        del input_list[index]
    except IndexError:
        return default_value

【问题讨论】:

  • 请注意,虽然@DeepSpace 对您的问题给出了正确答案,但您甚至尝试这样做的事实可能表明您的程序设计存在问题。从列表中重复弹出,除非仅在非常接近列表末尾的位置进行,否则非常昂贵。您可能希望找到一种方法来按顺序处理列表,而不是从列表中重复弹出,或者使用不同的数据结构.
  • 我正在尝试制作一个快速脚本,该脚本使用 sys.argv 获取命令行参数,同时还存储默认参数。虽然我知道 argparser 可以解决这个问题,但我正在寻找一种快速的解决方案来处理这些参数而不会使代码过于复杂。
  • 执行此操作的有效方法是遍历列表,并创建两个新列表 - 一个是选项,另一个是独立参数。再说一次,真正有效的做法是使用argparseoptparse

标签: python list idioms


【解决方案1】:

copydel 是怎么回事?试试pop,然后抓住IndexError

def pop_default(input_list, index, default_value):
    try:
        return input_list.pop(index)
    except IndexError:
        return default_value

如果要在你的代码库中多次这样做,你可以使用一个子类(但是它可能会更令人困惑,所以最好只使用上面的函数)

from collections import UserList

class MyList(UserList):
    def pop(self, index, default_value=None):
        try:
            return super().pop(index)
        except IndexError:
            return default_value


my_list = MyList(['a'])
print(my_list.pop(0))
print(my_list.pop(0, 'default'))

输出

'a'
'default'

【讨论】:

    【解决方案2】:

    我会选择一个班轮:

    out = a.pop(a.index(value)) if value in a else default
    

    a 是您的列表。

    如果给你一个索引,那么

    out = a.pop(index) if index >=(len(a)-1) else default
    

    编辑:

    在@Andrew 观察到负索引,加上通过比较修复错字后,单行版本将导致:

    out = a.pop(index) if len(a)<=index<=len(a)-1 else default
    

    【讨论】:

    • 但是.pop 输入是一个索引,您的建议输入是一个值。您可以通过检查len 来修复它
    • 我的弹出输入是a.index(value),即找到该值的整数索引,如果找到的话。
    • 但输入 value。如果未提供value,则无法使用您的 sn-p
    • 如果给你一个索引,那么out = a.pop(index) if index &gt;=(len(a)-1) else default
    • 这在某些情况下有效,但不考虑负索引。 -len(a) &lt;= index &lt;= (len(a)-1) 会说明这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2013-08-11
    • 2021-01-17
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多