#python #python_3x #список #словари
Имеется два словаря, нужно перебрать ключ-значение в обоих словарях. Сравнить если одинаковые ключ-значения с помощью цикла for и параметра *args. Добавить в новый словарь одинаковые найденные ключ-значения. operator_one = { 2: 'break', 1: 'pass', 3: 'print', 4: 'yield', 5 :'try' , } operator_two = { 1: 'pass', 2:'global', 3: 'yield', 4: 'print', 5: 'try', } def operator_important(farg, *args): """Перебор ключ-значения в двух словарях при помощи args и записи в новый словарь.""" operator_main = dict() # создание словаря и запись в перем print("vocabulary_one:", farg) # вывод первого аргумента for key, value in args: # перебор ключ-значение в обоих словарях print("vocabulary_two:", arg) # вывод второго аргумента if key in args and value == args[key]: # если ключ-значение равно аргументу ключ-значение, то создаем новый словарь с ключом и значение operator_main[key] = value # добавляем в нов. словарь найденное ключ-значение, которое совпало Ошибка: ValueError: too many values to unpack (expected 2)
Ответы
Ответ 1
У меня вот так получилось: operator_one = {2: 'break', 1: 'pass', 3: 'print', 4: 'yield', 5: 'try', } operator_two = {1: 'pass', 2: 'global', 3: 'yield', 4: 'print', 5: 'try', } operator_three = {1: 'pass', 2: 'global', 3: 'yield', 4: 'print', 5: 'try', } def operator_important(*args: dict): operator_main = dict() # Создаем пустой словарь for key, value in args[0].items(): # Для ключа и значения из первого словаря... check = True # Устанавливаем флаг проверки в значение "Истина" for i in range(1, len(args)): # Проверяем все словари на совпадение if key not in args[i] or value != args[i][key]: # Если ключ отсутствует в другом словаре # или его значение отлично от проверяемого check = False # Устанавливаем флаг в значение "Ложь" break # И прерываем проверку ключа if check: # Если флаг сохранил значение "Истина" (То есть ключ присутствует во всех проверяемых словарях # и значения ключа во всех словарях равны operator_main[key] = value # Добавляем ключ и значение в новый словарь return operator_main print(operator_important(operator_one, operator_two, operator_three)) Немного упростил функцию: def operator_important(*args: dict): operator_main = dict() # Создаем пустой словарь for key, value in args[0].items(): # Для ключа и значения из первого словаря... for i in range(1, len(args)): # Проверяем все словари на совпадение if key not in args[i] or value != args[i][key]: # Если ключ отсутствует в другом словаре # или его значение отлично от проверяемого break # Прерываем проверку ключа else: # Если цикл не прерывался (То есть ключ присутствует во всех проверяемых словарях # и значения ключа во всех словарях равны operator_main[key] = value # Добавляем ключ и значение в новый словарь return operator_mainОтвет 2
Вы можете послать параметры в функцию с помощью распаковки, привожу возможные варианты для это функции: operator_one = { 2: 'break', 1: 'pass', 3: 'print', 4: 'yield', 5 :'try' , } operator_two = { 1: 'pass', 2:'global', 3: 'yield', 4: 'print', 5: 'try', } def my_dict(d1, d2): d3 = dict() for k in d1: if k in d2 and d1[k] == d2[k]: d3[k] = d1[k] return d3 print (my_dict(*(operator_one, operator_two))) print (my_dict(operator_one, *(operator_two, ))) print (my_dict(operator_one, operator_two, *())) # {1: 'pass', 5: 'try'} Если вы хотите посылать неограниченное количество словарей в функцию то можно так: operator_three = { 1: 'qwerty', 2:'global', 3: 'yield', 4: 'print', 5: 'try', } def my_dict(*d_tuple): w = [x.items() for x in d_tuple] first = w[0] other = w[1:] res = [] for f in first: s = 1 for elem in other: if f not in elem: s = 0 break if s: res.append(f) return dict(res) print (my_dict(*(operator_one, operator_two, operator_three))) # {5: 'try'}Ответ 3
Ошибка в комманде for key, value in args: # перебор ключ-значение в обоих словарях так как args - кортеж из одного элемента (словаря, заданного как параметр). И так, вместо args нужно везде писать args[0] (и в цикле for добавить ещё .items()): for key, value in args[0].items(): # перебор ключ-значение в обоих словарях print("vocabulary_two:", args[0]) # вывод второго аргумента if key in args and value == args[0][key]: # если ключ-значение равно аргументу ключ-значение, то создаем новый словарь с ключом и значение Но луже вашу функцию слишком изменить - исключить параметр farg, т.к оба параметра могут быть в кортежи args: def operator_important(*args): """Перебор ключ-значения в двух словарях при помощи args и записи в новый словарь.""" operator_main = dict() # создание словаря и запись в перем print("vocabulary_one:", args[0]) # вывод первого аргумента for key, value in args[0].items(): # перебор ключ-значение в обоих словарях print("vocabulary_two:", args[1]) # вывод второго аргумента if key in args and value == args[key]: # если ключ-значение равно аргументу ключ-значение, то создаем новый словарь с ключом и значение operator_main[key] = value # добавляем в нов. словарь найденное ключ-значение, которое совпало
Комментариев нет:
Отправить комментарий