Мы можем написать генератор, чтобы получить все комбинации дополнений
from itertools import combinations, product
def all_combinations(seq):
for i in range(len(seq)):
yield from combinations(seq, i)
Затем мы можем использовать продукт, чтобы получить все обрезки и каждую комбинацию дополнений
product(trims.items(), all_combinations(extras.items()))
Это даетнас ((trim, price), ((extra, price), ...))
кортежей.Мы хотим получить ((trim, (extra, ...)), price)
кортежей, чтобы мы могли написать функцию
def sum_prices(t):
(trim, price), extras_t = t
if extras_t:
extras, prices = zip(*extras_t)
else:
extras, prices = (), ()
price += sum(prices)
return ((trim, extras), price)
Тогда мы можем получить максимальную цену ниже нашего порога
threshold = 170500- 159000
prices = map(sum_prices, product(trims.items(), all_combinations(extras.items())))
prices = ((options, price) for options, price in prices if price <= threshold)
best = max(prices, key=lambda t: t[1])
# (('A', ('cruise', 'air')), 11000)