2015-11-06 8 views
0
Dish = namedtuple('Dish', 'name price calories') 
da = Dish("Mac N' Cheese", 8.00, 750) 
db = Dish('Grilled Cheese', 6.50, 500) 
dc = Dish('Hamburger', 9.50, 1000) 
dd = Dish('Caeser Salad', 8.25, 650) 
de = Dish('Fish Tacos', 11.25, 1150) 

DL = [ da, db, dc, dd, de ] 

мне нужно изменить цену всех элементов DL на определенный процент, но функции я писал только возвращает деВозврат только возвращение последнего пункта

def Dishlist_change_price(DL: list, percentage: float) -> list: 
    result = [ ] 
    x = percentage/100 
    for i in DL: 
     y = i.price + (i.price * x) 
     result = i._replace(price = y) 
    return result 

Что плохого в коде для него чтобы вернуть только последнее блюдо? Метод

+1

Minor боковой примечание: Определение 'х = 1 + процент/100', то' у = i.price * x' упростит код и уменьшит ошибку с плавающей запятой. Конечно, с плавающей точкой - ужасный тип данных для финансовых данных; переключение на 'decimal.Decimal' или, по крайней мере, изменение на' y = round (i.price * x, 2) ', вы получите целые цента вместо частичных пенни с растущей ошибкой, поскольку вы многократно корректируете цены. – ShadowRanger

ответ

1

Используйте Append(), чтобы добавить элемент в список:

def Dishlist_change_price(DL: list, percentage: float) -> list: 
    result = [] 
    x = percentage/100 
    for i in DL: 
     y = i.price + (i.price * x) 
     result.append(i._replace(price=y)) 
    return result 
2

Вы result = i._replace(price = y) так на каждой итерации цикла вы измените результат будет самым последним DL. Вместо этого вам нужно указать result.append(i._replace(price = y)).

0

изменить последнюю строку, добавляемых в массив

как result.append (i._replace (цена = у)

0
result = i._replace(price = y) 

result повторную привязку к новому namedtuple объекта, возвращенного _replace(). Как это один раз для каждого элемента в списке, из вашей функции возвращается только последний. Вместо этого вы должны использовать list.append():

result.append(i._replace(price = y)) 

или еще лучше, список понимание:

def Dishlist_change_price(DL: list, percentage: float) -> list: 
    x = 1 + percentage/100.0 
    return [d._replace(price=(d.price*x)) for d in DL] 

Вы, вероятно, не следует использовать _replace(); ведущее подчеркивание в имени метода предполагает, что оно предназначено для частного использования внутри класса. (См. PEP-8 относительно идентификаторов с ведущими символами подчеркивания). Однако, поскольку _replace() является documented и доступен в обеих версиях Python, маловероятно, что он исчезнет или будет изменен. Тем не менее, более безопасный способ заключается в четком экземпляр нового Dish в списке понимания, как это:

def Dishlist_change_price(DL: list, percentage: float) -> list: 
    x = 1 + percentage/100.0 
    return [Dish(d.name, d.price*x, d.calories) for d in DL] 
Смежные вопросы