У меня есть пункт меню в качестве ключа и цена как значение. Там может существовать сочетание предметов, которые будут немного дешевле, чем отдельные предметы. Для EXA:исправьте меня для использования генераторов или скажите мне другим способом
menu = {
('burger',) : 5.00,
('pizza',) : 12.00,
('coke',) : 4.00,
('macpuff',) : 4.00,
('pasta',) : 3.00,
('french_fries',) : 2.00,
('burger', 'coke', 'french_fries') : 10.00,
('pizza', 'coke') : 15.00,
}
Теперь предположим, что я заказал несколько пунктов, то выход будет мин сумма данного заказа:
I/P > burger, coke
O/P > 9 (5.00 + 4.00)
I/P > burger, coke, french_fries
O/P > 10.00
I/P > pizza, coke, french_fries
O/P > 17.00 (15.00 + 2.00)
здесь код я попытался так для всех цен, которые я буду использовать в качестве генераторов :
def isSubset(a, b):
"""
compare two iterable and return true if first is subset of second
"""
b = list(b)
if not hasattr(a, '__iter__'):
a = [a]
for each in a:
try:
b.remove(each)
except ValueError:
return False
return True
def rest_min_price(order):
if order:
for item, price in menu.iteritems():
if isSubset(order[0], item):
new_order = order[1:]
for itm in item:
try:
new_order.remove(itm)
except ValueError:
pass
yield price + rest_min_price(new_order)
, но когда я запускаю это он говорит об ошибке типа:
for each in rest_min_price(order_item):
print each
TypeError: unsupported operand type(s) for +: 'int' and 'generator'
Обратите внимание, что 'list.remove' удаляет только первое найденное совпадение, вы можете использовать LC здесь:' new_order = [x для x в порядке [1:], если x не в элементе] ' –