2013-11-20 20 views
2

我有一個類,看起來像這樣。如何使用Python中的循環將對象添加到類中?

class CharInStageList(object): 
    def __init__(self, charid, charname) : 
     self.charid = charid 
     self.charname = charname 

進入這個類我想添加列表,我有。

我知道如何做到這一點的normall方式

charOne = CharInStageList(1,'Tim') 
charTwo = CharInStageList(2,'Struppi') 

那不是一個問題,什麼我其實想做的是通過使用一個循環來添加。

我得到了這種形式我的數據

((1,'Tim'),(4,'Struppi')) 

((1,'Tim'),(4,'Struppi'),(5,'Nami'),(6,'Luffy')) 

我在現場charachters的量是不同的百達。 我想象會是一個循環這樣

charlist = ((1,'Tim'),(4,'Struppi')) 
for char in charlist 
    objname = CharInStageList(char[0],char[1]) 

像這樣

我希望objname表,以自身爲每個對象我添加到類改變。

我怎樣才能得到這個效果。 我只能使用Python 2.6.6這一點,因爲它是瑪雅2013蟒蛇

編輯:

THX @西拉射線@chepner @theodox我看着日文N3 N4 N5了一點,這幾乎是我需要什麼
我在其上使用了@chepner方法的修改版本。

object_dict = dict((y, CharInStageList(x,y)) for x,y in data) 

就像一個魅力

我testcode看起來像這樣

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

我本來希望在你的答案與代碼exsamples發表評論,但我不能讓那個在那裏工作。

回答

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)) 
+0

這有點令人尷尬,但我嘗試用一​​些代碼評論30次現在,我敢肯定我做了正確的空間,因爲它與問題一起工作。但它不會正確地結束。 – masamoto

+0

代碼在評論中很棘手。你可以編輯你的問題來澄清你想要的。不過,我猜測,你希望'CharInStateList'充當一個容器。我會嘗試用我認爲你可能會問的問題更新我的答案。 – chepner

0

你不能(至少在沒有黑客入侵的情況下不能在locals/globals,這通常不是一個好主意)改變你分配的名字動態的那樣。但是,您可以將它們插入字典中,其中的鍵是動態生成的名稱。

characters = {} 
for char_data in char_list: 
    characters[char_data[1]] = CharInStageList(*char_data) 

但如果所有的人物對象存儲是名稱和ID,它可能會更有意義,簡化了整個事情,只需要創建映射詞典,而不是對象。

character_names_by_id = dict(char_data) 
character_ids_by_name = dict((name, id) for id, name in char_data) 
+0

我對Python很新穎。是否是全球性的? 我嘗試使用類的唯一原因是因爲它們是全局的並保持正確的值。 我會嘗試點點滴滴,看看他們是否可以做我所需要的。 感謝您的答案:) – masamoto

+0

既不是字典也不是類(也不是類實例)本質上是全局的。如果在離開創建它們的作用域後需要維護對該實例的引用,則應將它們打包到對象或模塊中,然後傳遞該對象。 –

0

@ chepner的回答是一個偉大的,如果你可以使用* ARGS表上填寫你的類的實例。

如果你只是在尋求最有效的方式,從一個循環做到這一點,還記得你可以遍歷一個元組的部分組合在一起:

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是一個很好的數據結構,用於創建易於使用的元組。這也意味着你可以互換地使用位置或命名參數,就像在@chepner's * args版本中一樣:

StageListChar = namedtuple('CharInStageList', ['id', 'name']) 
class_data = map(StageListChar , data) 
+0

現在XD開始很多了。開始有點頭暈。我需要的只是一種將一個由一個def生成的charachters列表轉移到另一個def以供進一步使用的方法。這個清單看起來像那樣。 但感謝所有偉大的方式來做到這一點:)我會研究它。盡力爲未來的項目學習。 – masamoto

相關問題