繁体   English   中英

生成递归命名的对象列表

[英]Generate list of objects named recursively

我的目标是获取名为 递归地 动态地。 这是我尝试的代码。 我希望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

这是错误:

Object_%s = Object() %num
SyntaxError: can't assign to operator

看到页面上的注释后,真正的答案就是使用列表,而不要尝试给出对象名称来表示它们在列表中的位置 您正在尝试做的是反模式。 您不需要设置对象的“名称”,就好像您要访问object_n ,可以通过objects[n]获得它。 另外,您可以使用dictnamedtuple而不是自定义类来使事情保持简单。

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'])

对于问题中的特定错误:

您不能在变量名中使用% ,因为它是一个运算符 请参阅此处了解您可以使用的名称:

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
>>>

您问题中的代码中还有其他问题可能会咬您:

  • 您的Object具有类变量,而没有实例变量。
  • 您以某种方式混合了字符串和整数。
  • 您实际上并没有在代码中使用递归(尽管在大多数情况下这是一件好事)。

你的意思是:

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

因为否则,您似乎正在尝试格式化实时代码行而不是字符串。 那是代码中明显的错误-但是否则我必须与所有其他人一致-如果您没有创建变量的充分理由-只需使用dic。

我想你想要一个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>

您试图动态创建不可能的变量名。 %运算符仅适用于字符串,不适用于标识符。 您可能要在此处使用字符串列表。

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

请注意,即使执行此操作,在打印列表时也不会获得变量名列表。 您将获得一个值列表。

还有另一种方法:

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

假设您有以下五个变量:

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] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM