【问题标题】:Automated Inclusion of Objects in Python List在 Python 列表中自动包含对象
【发布时间】:2016-09-25 00:20:21
【问题描述】:

我声明了一个类,在__init__ 方法中,我声明了两个变量,它们将与该类的一个实例相关联。每个声明的变量都被初始化为一个 NumPy 的零数组,然后用其他数据填充。

在某些时候,在这个__init__ 方法之外,我需要遍历一个包含每个变量(NumPy 数组)的对象,并将每个变量中的数组值重置为零。因此,在__init__ 方法中,我想将所有这些变量添加到列表中以供以后迭代。如果我手动执行一次,这很简单。

但是,我需要经常添加和删除在__init__ 中声明的一些变量。每次我这样做时,我都不想手动调整列表中包含的变量。

如何创建listdict 或这些变量的其他容器,这些变量会自动调整自身,使其包含所有正在初始化的变量,而不管这些变量的数量是多少?此外,self.container_of_arrays 不得包含来自__init__ 的“其他”变量,例如self.array_length

我所拥有的,如果创建了 self.my_variable_three,则当前必须手动调整 self.container_of_arrays

class generic_class():
    def __init__(self, array_width_one, array_width_two):
    self.array_length = some_integer

    self.my_variable_one = numpy.zeros((self.array_length, array_width_one), dtype=float)
    self.my_variable_two = numpy.zeros((self.array_length, array_width_two), dtype=float)

    self.container_of_arrays = [self.my_variable_one, self.my_variable_two]

我试图在dict 中声明我的变量,以便从一开始它们就包含在dict 中,但这会导致对未定义变量的引用。例如

    self.container_of_arrays = OrderedDict([(self.my_variable_one, numpy.zeros((self.array_length, array_width_one), dtype=float)),
                                            (self.my_variable_two, numpy.zeros((self.array_length, array_width_two), dtype=float))
                                           ])

更新:

xli 的回答提供了正确的解决方案。如建议的那样,可以使用 dict 或 OrderedDict 按名称访问数组。对于任何想要这样做的人,这是我实际实现的代码:

my_data = [('variable_one_name', len(variable_one_data)),
           ('variable_two_name', len(variable_two_data)),
          ] # Intentionally outside the class in a location where variables are added by the user

class generic_class():
    def __init__(self, array_length, my_data):

    self.container_of_arrays = OrderedDict((variable_name, numerix.zeros((array_length, array_width), dtype=float))
                                                    for variable_name, array_width in my_data)

【问题讨论】:

  • 您是否需要通过属性名称来引用这些数组,例如my_variable_one,或者你可以在容器中索引,container_of_arrays[1]。由于这是一个列表,您可以轻松地append 新项目和删除项目。

标签: python list numpy dictionary containers


【解决方案1】:

与其为每个 numpy 数组创建一个变量,不如直接创建一个包含所需数组的数组列表,并通过索引引用它们?

class generic_class():
    def __init__(self, array_length, array_widths=[]):
        self.array_length = array_length
        self.arrays = [
             numpy.zeros((self.array_length, array_width), dtype=float) 
             for array_width in array_widths
        ]

然后你可以通过索引访问每个数组self.arrays[i]

或者,如果您需要按名称访问数组,则可以使用仅包含字符串(数组名称)的 dict 作为每个数组的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多