我有一个看起来像这样的课。
class CharInStageList(object):
def __init__(self, charid, charname) :
self.charid = charid
self.charname = charname
进入这个课程,我想添加我有的列表。
我知道如何以正常的方式做到这一点
charOne = CharInStageList(1,'Tim')
charTwo = CharInStageList(2,'Struppi')
这不是问题,我真正想要做的是使用循环添加它们。
我以这种形式获取我的数据
((1,'Tim'),(4,'Struppi'))
或
((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
我在场景中的字符数总是不同的。 我想象的将是这样的循环
charlist = ((1,'Tim'),(4,'Struppi'))
for char in charlist
objname = CharInStageList(char[0],char[1])
类似这样的事情
我希望objname能够为我添加到类中的每个对象自行更改。
我怎样才能得到这种效果。 我只能使用python 2.6.6,因为它是maya 2013 python
编辑:
Thx @ silas-ray @chepner @theodox我更多地看了Dicts,这正是我需要的东西 我在其上使用了@chepner方法的修改版本。
object_dict = dict( (y, CharInStageList(x,y)) for x,y in data )
像魅力一样工作
我的测试代码看起来像这样
import maya.cmds as cmds
dicttest = {}
def getdata ():
global dicttest
data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
dicttest = dict( (y,(x,y)) for x,y in data )
getdata()
def printtest() :
for char in dicttest:
print dicttest[char]
printtest()
dicttest.clear()
我本来希望用代码示例评论您的答案,但我无法在那里工作。
答案 0 :(得分:2)
对象不会添加到类中。相反,您可以使用列表解析并利用*args
语法创建一个对象列表,这些对象都是同一个类的所有实例:
data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
object_list = [ CharInStageList(*x) for x in data ]
也许你想要一本字典:
object_dict = dict( (y, CharInStageList(x,y)) for x,y in data )
(请注意,CharInStageList
是一个糟糕的类名,因为它不是一个列表;它封装了一个字符。)
如果你真的希望CharInStateList
成为一个字符集合,请尝试这样的事情,这只是一个字典的薄包装:
# Your former CharInStageList
class Character(object):
def __init__(self, charid, charname) :
self.charid = charid
self.charname = char name
class OnStageCharacters(object):
def __init__(self):
self.characters = dict()
# Index on-stage characters using their charid
def add(self, character):
self.characters[character.charid] = character
on_stage = OnStageCharacters()
for id, name in data:
on_stage.add( Character(id, name) )
答案 1 :(得分:0)
你不能(至少不是没有攻击locals
/ globals
,这通常不是一个好主意)改变你动态分配的名称。但是,您可以将它们插入到字典中,其中键是动态生成的名称。
characters = {}
for char_data in char_list:
characters[char_data[1]] = CharInStageList(*char_data)
虽然如果你的所有角色对象都存储了name和id,那么简化整个事物并创建映射字典而不是对象可能更有意义。
character_names_by_id = dict(char_data)
character_ids_by_name = dict((name, id) for id, name in char_data)
答案 2 :(得分:0)
如果您可以使用* args表单填写您的班级实例,那么@ chepner的答案很棒。
如果您只想从循环中提出最有效的方法,请记住您可以一起迭代元组的各个部分:
data = ((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy'))
class_data = (CharInStageList(id, name) for id, name in data) # "for id, name" will yield two vals
您还可以使用map,这在进行批量数据转换时非常常见。一个常见的方法是使用lambda,这样你就可以清楚地写出来了:
to_char = lambda k: CharInStageList(k[0], k[1])
class_data = map(to_char, data)
如果你做的事情和你的例子一样简单,你可能不想打扰你自己的班级。 namedtuple是一个很好的数据结构,用于创建易于使用的元组。这也意味着你可以互换地使用位置或命名args,就像在@chepner的* args版本中一样:
StageListChar = namedtuple('CharInStageList', ['id', 'name'])
class_data = map(StageListChar , data)