@yakumara

Пересечение словарей в python 3.7.4?

Есть два словаря:
pizza = {'мука, кг': 1,
         'помидоры, кг': 1.5,
         'шампиньоны, кг': 1.5,
         'сыр, кг': 0.8,
         'оливковое масло, л': 0.1,
         'дрожжи, г': 50}
salad = {'огурцы, кг': 1,
         'перцы, кг': 1,
         'помидоры, кг': 1.5,
         'оливковое масло, л': 0.1,
         'листья салата, кг': 0.4}


Нужно написать функцию, которая создаёт множество set() и убирает повторяющиеся ключи. Если ключи повторяются, то складывает значения по ключам, а потом выводит каждый продукт в формате "ключ": "значение 1 словаря + значение 2 словаря"
Я написал вот такую функцию, но не могу сделать сложение значений.
def print_shopping_list(recipe1, recipe2):
    recipe_set = set(recipe1)
    general_recipe_set = recipe_set.union(recipe2.keys())
    for ingr in general_recipe_set:
        if ingr in recipe1.keys() and recipe2.keys():
            result = recipe1[ingr] + recipe2[ingr]
            print(result)
  • Вопрос задан
  • 2806 просмотров
Решения вопроса 3
longclaps
@longclaps
def print_shopping_list(*recipes):
    res = {}
    for recipe in recipes:
        for k, v in recipe.items():
            res[k] = res.get(k, 0.) + v
    for k, v in res.items():
        print(f'{k}: {v}')
    print('------------------------------')


print_shopping_list(pizza, salad)
print_shopping_list(pizza, pizza, pizza)
Ответ написан
Комментировать
@Taus
Не забывайте, что есть замечательный defaultdict.
from collections import defaultdict
import itertools

def combine_recipes(*recipes):
    combined_recipe = defaultdict(float)
    for ingridient, amount in itertools.chain.from_iterable(map(dict.items, recipes)):
        combined_recipe[ingridient] += amount
    
    return combined_recipe

Без ФП(itertools)
from collections import defaultdict

def combine_recipes(*recipes):
    combined_recipe = defaultdict(float)
    for recipe in recipes:
        for ingridient, amount in recipe.items():
            combined_recipe[ingridient] += amount
    
    return combined_recipe

update: дополнил longclaps
Ответ написан
adugin
@adugin Куратор тега Python
from collections import Counter

Counter(pizza) + Counter(salad)

Универсальный способ:
def print_cart(*recipes):
    cart = Counter()
    for recipe in recipes:
        cart.update(recipe)
    for item in sorted(cart.items()):
        print(*item, sep=': ')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@yarik_yarik
Не приятное задание))) я тоже долго не мог понять
def print_shopping_list(recept1, recept2):
    songs1 = set(recept1)
    son = songs1.union(set (recept2))
    for i in son:
        if i in recept1 and i in recept2:
            res = recept1[i] + recept2[i]
            print (i + ': ' + str(res))
        elif i in recept1:
            print(i + ': ' + str(recept1[i]))
        else:
            print (str(i) + ': ' + str (recept2[i]))
pizza = {'мука, кг': 1,
         'помидоры, кг': 1.5,
         'шампиньоны, кг': 1.5,
         'сыр, кг': 0.8,
         'оливковое масло, л': 0.1,
         'дрожжи, г': 50}
salad = {'огурцы, кг': 1,
         'перцы, кг': 1,
         'помидоры, кг': 1.5,
         'оливковое масло, л': 0.1,
         'листья салата, кг': 0.4}

print_shopping_list(pizza, salad)
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
Мне не нравится set() с ним результат нехорошо отсортирован.
>>> pizza,salad = {'мука, кг': 1,
         'помидоры, кг': 1.5,
         'шампиньоны, кг': 1.5,
         'сыр, кг': 0.8,
         'оливковое масло, л': 0.1,
         'дрожжи, г': 50},{'огурцы, кг': 1,
         'перцы, кг': 1,
         'помидоры, кг': 1.5,
         'оливковое масло, л': 0.1,
         'листья салата, кг': 0.4}
>>> def summ(a,b):
	c= {}
	for k in list(a.keys())+list(b.keys()):
		if k in b:c[k] = b[k]
		if k not in c: c[k] = 0
		if k in a:c[k] += a[k]
	return c

>>> summ(pizza,salad)
{'мука, кг': 1, 'помидоры, кг': 3.0, 'шампиньоны, кг': 1.5, 'сыр, кг': 0.8, 'оливковое масло, л': 0.2, 'дрожжи, г': 50, 'огурцы, кг': 1, 'перцы, кг': 1, 'листья салата, кг': 0.4}
>>> s = {}
>>> s = summ(s,pizza)
>>> s = summ(s,salad)
>>> s
{'мука, кг': 1, 'помидоры, кг': 3.0, 'шампиньоны, кг': 1.5, 'сыр, кг': 0.8, 'оливковое масло, л': 0.2, 'дрожжи, г': 50, 'огурцы, кг': 1, 'перцы, кг': 1, 'листья салата, кг': 0.4}
>>>

list(a.keys())+list(b.keys()) экивалентно set(a).union(set(b))
Ответ написан
solotony
@solotony
покоряю пик Балмера
на языке python эта операция делается примитивно

{ k:pizza.get(k, 0)+salad.get(k, 0) for k in set(pizza) | set(salad) }


для желающих получить отсортированный результат

{ k:pizza.get(k, 0)+salad.get(k, 0) for k in sorted(set(pizza) | set(salad)) }
Ответ написан
Комментировать
@dk47139
def print_shopping_list(dish1, dish2):
    x = set(dish1)
    y = set(dish2)
    unique_ingredients = x.union(y)
    for i in unique_ingredients:
        amount = 0
        if i in dish1.keys():
            amount += dish1[i]
        if i in dish2.keys():
            amount += dish2[i]
        print(i + ':', amount)
            
        


pizza = {'мука, кг': 1,
         'помидоры, кг': 1.5,
         'шампиньоны, кг': 1.5,
         'сыр, кг': 0.8,
         'оливковое масло, л': 0.1,
         'дрожжи, г': 50}
salad = {'огурцы, кг': 1,
         'перцы, кг': 1,
         'помидоры, кг': 1.5,
         'оливковое масло, л': 0.1,
         'листья салата, кг': 0.4}

print_shopping_list(pizza, salad)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы