Есть ли способ застегнуть внутренние элементы списка / кортежа в python? - PullRequest
2 голосов
/ 09 марта 2020

Я столкнулся с простой проблемой python, которую нужно решить: имея списки из 3 категорий элементов и их соответствующие значения, распечатайте все комбинации в трех списках, которые имеют более низкое общее значение, чем X. (Пример кода может быть более понятным объяснение).

Мне удалось решить эту проблему с помощью zip () и itertools.product () для создания комбо, но когда дело доходит до вывода правильных комбо, я чувствую, что должно быть лучше, далее pythoni c путь к express выходу путем сжатия внутренних кортежей продуктов для получения суммы цен без необходимости создания 2 явных генераторов / списка (вариант использования в данном случае не имеет значения), я считаю). Исходя из Java фона, у меня все еще иногда возникают проблемы, когда я не впадаю в Java -подобный синтаксис, чего я определенно хочу избежать с помощью Python.

Вот мой код:

import itertools

# Print out all possible meal combinations under $30

main_courses = ['beef stew', 'fried fish']
price_main_courses = [28, 23]

desserts = ['ice-cream', 'cake']
price_desserts = [2, 4]

drinks = ['cola', 'wine']
price_drinks = [3, 10]

products = itertools.product(
    zip(main_courses, price_main_courses),
    zip(desserts, price_desserts),
    zip(drinks, price_drinks)
)

for combo in products:
    names = (x[0] for x in combo)
    price = sum((x[1] for x in combo))
    if price <= 30:
        print(*names, price)

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

На основании это for-l oop может быть записано как:

for combo in products:
    names, prices = zip(*combo)
    price = sum(prices)
    if price <= 30:
        print(*names, price)
1 голос
/ 09 марта 2020

вы можете использовать списки

result = [(m, de, dr) for (m, mp), (de, dep), (dr, drp) in products if mp + dep + drp <= 30 ]

или вы можете манипулировать структурой данных, используя dict для хранения названия ваших продуктов и цен вместо использования 2 списков:

import itertools

# Print out all possible meal combinations under $30
main_courses_price = {'beef stew': 28, 'fried fish': 23}
desserts_price = {'ice-cream': 2, 'cake': 4}
drinks_price = {'cola': 3, 'wine': 10}

full_prices = {**main_courses_price, **desserts_price, **drinks_price}
products = itertools.product(main_courses_price, desserts_price, drinks_price)


print(*(t for t in products if sum(map(full_prices.get, t)) <= 30), sep='\n')

вывод:

('fried fish', 'ice-cream', 'cola')
('fried fish', 'cake', 'cola')
1 голос
/ 09 марта 2020

Ммм, единственное, что я хотел бы сделать, это использовать списочные выражения вместо l oop, например:

import itertools

# Print out all possible meal combinations under $30

main_courses = ['beef stew', 'fried fish']
price_main_courses = [28, 23]

desserts = ['ice-cream', 'cake']
price_desserts = [2, 4]

drinks = ['cola', 'wine']
price_drinks = [3, 10]

products = itertools.product(
    zip(main_courses, price_main_courses),
    zip(desserts, price_desserts),
    zip(drinks, price_drinks)
)

combos = [
    combo for combo in products if sum(price for name, price in combo) <= 30
]

for combo in combos:
    print(' + '.join(name for name, price in combo), '=', sum(price for name, price in combo))

>>> "fried fish + ice-cream + cola = 28"
>>> "fried fish + cake + cola = 30"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...