Как создать словарные комбинации?Самая дорогая проблема с автомобилем - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать комбинации из списка 2 словарей.

Из триммеров выберите 1 элемент.

Из дополнительных элементов выберите от 1 до 4 элементов;но они не могут быть повторены.

def costliestCar(maxPrice):
    basePrice = 159000

    trims = {'A': 0, 'B': 22000, 'C': 40000}
    extras = {'cruise': 4000, 'air': 7000, 'alloy': 8000, 'chrome': 13000}   

return carSpecification

Рассмотрим максимальную цену 170500. За вычетом базовой цены остается потратить 11500.Самая дорогая комбинация автомобилей в рамках бюджета - это уровень отделки салона A с дополнительными опциями Cruise и Chrome, поэтому выходная функция должна составлять:

A, cruise, chrome

Таким образом, общая цена автомобиля составляет 159000 + 0.+ 4000 + 7000 = 170000, что не превышает бюджет 170500.

costliestCar(maxPrice=170500)
    output: A, cruise, chrome

Я думал, что-то вроде;но тогда я застрял:

carlist = []
for trim in trims:
    car = (basePrice, trim)
    carlist.append(car)

1 Ответ

0 голосов
/ 10 декабря 2018

Мы можем написать генератор, чтобы получить все комбинации дополнений

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)
...