Назначьте две переменные с помощью выражения генератора с условным условием - PullRequest
0 голосов
/ 07 мая 2018

В приведенном ниже коде есть словарь, содержащий различные сыры, а также их количество. На основе заранее определенного списка товаров для продажи код затем печатает общее количество сыров, которые продаются, по сравнению с полной ценой.

Я использую выражения генератора для вычисления итогов, но мне интересно, есть ли способ сжать мой код, чтобы назначить одновременно переменные sale_count и full_price_count с каким-то условием if-else, так как код для генераторов практически одинаков.

cheeses = {'gouda': 3, 'cheddar': 7, 'american': 2, 'mozzarella': 5}
on_sale = ['american', 'blue cheese', 'cheddar', 'provolone', 'swiss']

# if the cheese is on sale, add its quantity to sale_count
# otherwise, add its quantity to full_price_count
sale_count = sum(qty for (cheese, qty) in cheeses.items() if cheese in on_sale)
full_price_count = sum(qty for (cheese, qty) in cheeses.items() if cheese not in on_sale)

print("Sale count: {}\nFull price count: {}".format(sale_count, full_price_count))

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Это можно сделать в одном выражении как:

functools.reduce(
    lambda x, y: (x[0] + y[0], x[1] + y[1]),
    ((qty, 0) if cheese in on_sale else (0, qty) for cheese, qty in cheeses.items()), 
    (0, 0))

Но тогда это, как и в случае с другими потенциальными ответами, может действительно ответить на вопрос, почему вещи не всегда нужно упрощать в одно выражение, когда два совершенно ясно.

0 голосов
/ 07 мая 2018

Еще один способ сделать это заключается в следующем, но я согласен с @donkopotamus: если у вас нет проблем с производительностью, с двумя выражениями все в порядке.

sale_count, full_price_count  = map(sum, zip(*((v * (c in on_sale), v * (c not in on_sale)) for c, v in cheeses.items())))
0 голосов
/ 07 мая 2018

Он не очень читаемый, но в одной строке он делает то, что вы хотите:

[sale_count, full_price_count] = map(sum, zip(*[(qty, 0) if cheese in on_sale else (0, qty) for cheese, qty in cheeses.items()]))
...