Заполнение списка объектами с использованием выражения понимания списка - PullRequest
3 голосов
/ 05 ноября 2011

Я пытаюсь заполнить список из 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 или, еслиболее оптимальный способ сделать это (с точки зрения читаемости кода или скорости)?

Ответы [ 3 ]

7 голосов
/ 05 ноября 2011
[Ingredient(*ing) for ing in ings]
1 голос
/ 05 ноября 2011

Вы должны просто создать 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),
   ]
0 голосов
/ 05 ноября 2011
self.ing = [Ingredient(*options) for options in ings]
...