Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Перебор ключ-значение в 2-х и более словарях и запись совпадения в новый словарь через *args

#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 # добавляем в нов. словарь найденное ключ-значение, которое совпало

Комментариев нет:

Отправить комментарий