在Python列表中自动包含对象

时间:2016-09-25 00:20:21

标签: python list numpy dictionary containers

我宣布了一个类,并且在__init__方法中,我宣布了两个与该类实例相关联的变量。每个声明的变量都初始化为NumPy零数组,稍后会用其他数据填充。

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

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

如何创建这些变量的listdict或其他容器,这些变量会自动调整自身,使其包含所有这些初始化的变量,而不管这些变量的数量是多少?作为额外的复杂因素,self.container_of_arrays不得包含"其他"来自__init__的变量,例如self.array_length

我有什么,如果创建self.container_of_arrays,目前必须手动调整self.my_variable_three

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中,但是这会导致对未定义变量的引用。 E.g。

    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)

1 个答案:

答案 0 :(得分: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作为每个数组的键。