【问题标题】:How to fill a list with default arguments如何用默认参数填充列表
【发布时间】:2020-12-16 16:14:49
【问题描述】:

如何在创建类时使用默认元素填充条目列表,而不在任何位置放置任何内容? 例如。

MyClass([1,,3])

我想让我的班级了解它正在获取 [1,0,3],其中 0 是默认参数。

【问题讨论】:

  • 这与默认参数没有任何关系,因为那是一个列表。无法跳过列表文字中的元素,或默认列表文字中的元素 afaik。
  • 您是在问如何定义一个类,以便可以为该类的实例提供默认参数?
  • @itprorh66 是的,就是这样!
  • 由于[1,,3] 是无效语法,您不能这样做。您可以使用[1, None, 3],然后将每个None 替换为默认值。
  • 我认为你能得到的最接近的方法是放弃 [] 文字语法,而是直接使用关键字参数到 __init__。然后直接不包含就可以跳过和元素,可以在__init__的参数列表中指定默认。

标签: python python-3.x list class


【解决方案1】:

如果输入可能有大的空白部分,use a dict as a faux sparse list 会更容易。

def list_filler(dict_sparse, default=0):
    """Make a list out of a dict that acts as a faux sparse list."""
    top = max(dict_sparse)
    out = [dict_sparse.get(i, default) for i in range(top+1)]
    return out

用法:

>>> list_filler({0: 1, 2: 3})
[1, 0, 3]
>>> list_filler({1: 'b', 7: 'h'}, '.')
['.', 'b', '.', '.', '.', '.', '.', 'h']

请注意,否定键将被忽略。

【讨论】:

    【解决方案2】:

    Python 语法允许调用的默认值(包括对象创建),但仅限于参数的末尾。

    例子:

    class A:
        def __init__(self, x=1, y=2, z=3):
            ...
    

    然后你可以使用默认值:

    a = A()        # same as a = A(1, 2, 3)
    b = A(4)       # same as b = A(4, 2, 3)
    

    但是这个c = A(5, , 6) 是一个语法错误。如果你想使用默认参数而不是最后一个,你必须命名它们:

    c = A(5, c=6)  # same as c = A(5, 2, 6)
    

    【讨论】:

    • 嗨,谢尔盖!我的问题是我知道它像你说的那样工作,但我的问题是我被要求接收“列表列表”作为我的脚本的条目之一(它是一个矩阵类,它将维度作为第一个两个输入,作为第三个,列表列表将成为它的条目)。无论如何感谢语法错误的评论,我不知道
    【解决方案3】:

    您可以通过多种方式声明一个类并包含术语的默认值。

    class MyClass:
          def __init__(self, x=1, y=0, z=3):
                . . . . . . .
                . . . . . . . 
    

    注意:在这种情况下,值 x、y、z 由它们的位置决定,因此实例化 MyClass 需要提供所有三个值,或者不提供任何值。这可能无法满足您的需求。

    或者,您可以:

    class MyClass:
          def __init__(self, **args): 
                . . . . . . . 
                . . . . . . .
    

    在这种方法中,**args 是可能存在或不存在的命名参数的列表。如果存在,初始化函数将为相应的变量分配声明的值,如果不存在,初始化函数将采用默认值。 **args 变量在函数中显示为 {"ParameterName1": val, "ParameterName2: val,. . . . }

    形式的字典

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多