2011-11-05 11 views
2

1つのリスト内包表現を使用して8つのIngredientオブジェクトのリストを作成しようとしています。 コードは以下のようになります。リスト内包表記を使用してオブジェクトにリストを埋め込む

import random 
ings = (('w1', 200, 25, 80), 
    ('su1', 50, 55, 150), 
    ('su2', 400, 100, 203), 
    ('sy1', 10, 150, 355), 
    ('sy2', 123, 88, 101), 
    ('sy3', 225, 5, 30), 
    ('sy4', 1, 44, 99), 
    ('sy5', 500, 220, 300),) 

class Ingredient: 
    def __init__(self, n, p, mi, ma): 
     self.name = n 
     self.price = p 
     self.min = mi 
     self.max = ma 
     self.perc = random.randrange(mi, ma) 

class Drink: 
    def __init__(self): 
     self.ing = [] 

と私はこれと同等の結果を得るしたいと思います:

self.ing = [Ingredient('w1', 200, 25, 80), Ingredient('su1', 50, 55, 150) ... 
(and so it goes for the ings tuple) ] 

、私の質問は、より最適な方法がある場合LCEを使用するか、それを行う方法であります(コードの読みやすさやスピードの点で)これを行うのですか?

+0

あなたは常に読みやすい変数名を使用することができます。) – Blender

答えて

0
self.ing = [Ingredient(*options) for options in ings] 
1

あなただけの代わりにタプルを定義し、それらを変換するの、直接Ingredientインスタンスを作成する必要があります。

import random 

class Ingredient: 
    def __init__(self, name, price, min, max): 
     self.name = name 
     self.price = price 
     self.min = min 
     self.max = max 

     self.perc = random.randrange(self.min, self.max) 

ingredients = [ 
    Ingredient('w1', 200, 25, 80), 
    Ingredient('su1', 50, 55, 150), 
    Ingredient('su2', 400, 100, 203), 
    Ingredient('sy1', 10, 150, 355), 
    Ingredient('sy2', 123, 88, 101), 
    Ingredient('sy3', 225, 5, 30), 
    Ingredient('sy4', 1, 44, 99), 
    Ingredient('sy5', 500, 220, 300), 
    ] 
関連する問題