2017-08-27 4 views
0

を行うことができます。このことから今はどうすれば例えばので、クラスのインスタンスにすることができるインスタンス名のリスト

class Recipe: 
    def __init__(self, *args): 
    #does something with args 

list = [schnitzel, goulash] #list of instance names 
datalist =[[['chicken',2],['breadcrumbs', 100],['flour', 100]],[['beef', 500],['paprika powder', 100]] #these are the args which are in the same index as as its name in list. 

for i in list: 
    i = Recipe(datalist[list.index(i)]) 

私はグーラッシュとシュニッツェルはインスタンスになりたいです。しかし、goulashとschnitzelはどちらも未定義の変数なので、リストを作成しようとすると失敗するという問題があります。私は文字列に名前をつけてみました:

list = ['schnitzel', 'goulash'] 

しかし、それでもうまくいきません。

どうすればいいですか?ありがとう!引数を展開する

答えて

1

:ここで(リファクタリング後)私の提案です。

あなたのクラスの構造を変更して、何らかの種類のidを追加して、差別化できるようにしたいと思うかもしれません。 lst = ['schnitzel', 'goulash']

class Recipe: 
    def __init__(self, name, *args): 
     self.name = name 
     #does something with args 

次に文字列のリストにあなたのlistを変更します。

は今、あなたのリストを反復処理し、各食品名でオブジェクトを作成します。私は*ingredientsを行う

list_of_foods = [] 
for food, ingredients in zip(lst, datalist): 
    list_of_foods.append(Recipe(food, *ingredients)) 

argsに食材の内容を解凍します。そうすれば、もし私がargs[0]をやったら、私は('chicken', 2)を得るだろう。

今すぐあなたのオブジェクトのリストを持っている:

for food_obj in list_of_foods: 
    print(food_obj.name) # This will print "schnitzel" then "goulash" 

第2の方法は、辞書を使用しています。そのようなあなたのデータリストの構造を変更します。

datalist = {"schnitzel":[['chicken',2],['breadcrumbs', 100],['flour', 100]], 
"goulash":[['beef', 500],['paprika powder', 100]]} 

次に、あなたが行うことができます:

list_of_foods = [] 
for k, v in datalist.items(): 
    list_of_foods.append(Recipe(*v)) 

しかし、その後、あなただけのオブジェクトと食品のリストが残っていると何を区別する方法はありません食べ物は何ですか?あなたはでしたlist_of_foods.append([k, Recipe(*v)])を行うことができますが、これはちょっと混乱していると思います。それで私はRecipe.name属性を実装したのです。


ヒント:リストlistを指定しないと、組み込みタイプが上書きされます。

0

使用*オペレータ:

Recipe(*datalist[list.index(i)]) 

あなたはまた、イニシャライザに名前を渡すこともできます。私はおそらくお勧めします最初のうちここでは2つのソリューションがあります

class Recipe: 
    def __init__(self, name, *args): 
     print(name, args) 

dishes = ['schnitzel', 'goulash'] 
ingridients = [[['chicken', 2], ['breadcrumbs', 100], ['flour', 100]], [['beef', 500], ['paprika powder', 100]]] 
recipes = [Recipe(name, *args) for name, args in zip(dishes, ingridients)] 
+1

私はこれがOPが求めているとは思わない – TerryA

+0

彼の問題は彼のリストと関係しているので、「問題はgoulashとschnitzelが両方とも未定義の変数なので、リストを作成しようとすると失敗します」 – TerryA

関連する問題