生成递归命名的对象列表

时间:2015-04-25 11:18:22

标签: python debugging

我的目标是动态获取名为递归的对象列表。这是我试过的代码。 我希望AppleStrawberryBananaCitrusOrange yBan ApyBanpleSyBantrawberryBananaCitrusOrange object_list

[Object_0, Object_1, Object_2, Object_3, Object_4]

这是错误:

object_list = []

class Object(object):  
    size = ""
    price = ""

def create_object_list(object_list):   
    for num in range(5):
        Object_%s = Object() %num  
        object_list.append(Object_%s)
    return object_list

6 个答案:

答案 0 :(得分:0)

看过页面上的评论后,真正的答案是只使用一个列表,不要尝试给对象名称来表示它们在列表中的位置。你要做的是反模式。您无需设置对象的“名称”,就像您想要访问np.delete一样,您可以通过object_n获取该名称。此外,您可以简单地使用objects[n]namedtuple代替自定义类。

dict

对于问题中的具体错误:

您不能在变量名称中使用from random import random objects = [] for i in range(5): obj = {'size': random(), 'price': random()} objects.append(obj) print(objects[0]) print(objects[3]['size']) print(objects[1]['price']) ,因为它是operator。请参阅此处了解您可以在名称中使用的内容:

https://docs.python.org/2/reference/lexical_analysis.html#identifiers

%

您的问题中的代码中还有其他几个问题可能会让您感到困惑:

  • 您的>>> variable_name = 1 >>> variable_%name = 2 File "<input>", line 1 SyntaxError: can't assign to operator >>> 有类变量,而不是实例变量。
  • 你在某种程度上混合了字符串和整数。
  • 你实际上并没有在你的代码中使用递归(这在大多数情况下是好事)。

答案 1 :(得分:0)

你的意思是:

exec("Object_%s = Object()" %num)
exec("object_list.append(Object_%s)" %num)

因为否则看起来你正在尝试格式化代码而不是字符串。 这是你代码中明显的错误 - 但除此之外我必须同意所有其他错误 - 如果你没有充分的理由创建变量 - 只需使用一个dic。

答案 2 :(得分:0)

我想你想要一个object_dict

object_dict = {}

class Object(object):
    size = ""
    price = ""

def create_object_list(object_dict):
    for num in range(5):
        object_dict["Object_{}".format(num)] = Object()
    return object_dict

如果由于某种原因需要订购,请使用collections.OrderedDict:

from collections import OrderedDict
object_dict = OrderedDict()

将保持创建对象的顺序:

OrderedDict([('Object_0', <__main__.Object object at 0x7f05d4044390>), ('Object_1', <__main__.Object object at 0x7f05d3fd3710>), ('Object_2', <__main__.Object object at 0x7f05d3fd36d8>), ('Object_3', <__main__.Object object at 0x7f05d3fd3a90>), ('Object_4', <__main__.Object object at 0x7f05d273a278>)])

您可以按键访问每个对象:

print(object_dict["Object_0"])
<__main__.Object object at 0x7f05d4044390>

答案 3 :(得分:0)

您正在尝试动态创建不可能的变量名称。 %运算符仅适用于字符串而非标识符。你可能想在这里使用字符串列表。

如果您真的想要动态创建新变量,可以使用包含局部变量字典的locals()内置函数。例如,您可以使用locals()['object_%d' % num] = Object()。如果要创建全局变量,可以使用globals()函数。

请注意,即使您这样做,在打印列表时也无法获得变量名称列表;你会得到一个价值清单。

答案 4 :(得分:0)

另一种方法:

class Object(object):
    def __init__(self, inst_id):
        self.name = "Object_%d" % inst_id 
        self.size = ""
        self.price = ""

def create_object_list(object_list):
    for num in range(6):
        object_list.append(Object(num))
    return object_list         


for x in create_object_list(object_list):
    print x.name

Object_0
Object_1
Object_2
Object_3
Object_4
Object_5

答案 5 :(得分:0)

假设您有以下五个变量:

a = (1,2,3)
e = "a string"
i = 1.56
o = {'size':'small', 'price':'low'}
u = None

以及将它们分组的列表:

them = [a,e,i,o,u]

您可以通过这种方式创建此列表:

same = [eval(_) for _ in 'aeiou']
print(same)
# [(1, 2, 3), 'a string', 1.56, {'price': 'low', 'size': 'small'}, None]

因此,您需要创建的变量列表可以采用相同的方式完成:

object_list = [eval('Object_'+str(n)) for n in range(5)]

如果对象已经存在,你可以使用列表中的变量,但是为了自己创建变量,你可以这样做:

for _ in ('Object_'+str(n)+'=None' for n in range(5)): # or '=...' any appropriate value
    exec(_)                                            # it could be a call to your Object()

print(objcet_list)
# [None, None, None, None, None]