Как сравнить словари с функцией в Python 3

#python #function #dictionary #code-snippets

#python #функция #словарь #фрагменты кода

Вопрос:

Я хотел бы сравнить словари с точным шаблоном внутри функции. Моя конечная цель -:

  • Увеличение переменной на 3, когда 2 словаря имеют одинаковые ключ и значение
  • Уменьшение переменной на -1, если значение не совпадает
  • 0, если одна пара ключ / значение отсутствует

например:

 dict1 = {"EX1": "C", "EX2": "D", "EX4": "A", "EX5": "A"}
dict2 = {"EX1": "C", "EX2": "A", "EX3": "A", "EX4": "A", "EX5": "A"}
  

Ожидаемый результат:

8

8 потому что: -Ключ EX1 имеет одинаковое значение в обоих словарях (3)

-Ключ EX2 не имеет одинакового значения в обоих словарях (3-1 = 2)

-Ключ EX3 отсутствует в dict1, поэтому операция (2) отсутствует

-Ключ EX4 имеет одинаковое значение в обоих словарях (2 3 = 5)

-Ключ EX5 имеет одинаковое значение в обоих словарях (5 3 = 8)

Я получил из Интернета те два фрагмента, которые я не знаю, как преобразовать в функцию, я не знаю, могут ли они помочь:

 {k : dict1[k] for k in dict1 if k in rep_valid and dict1[k] == rep_valid[k]} #Get same items
{k : dict2[k] for k in set(dict2) - set(dict1)} #Get difference
  

Ответ №1:

Вы можете использовать понимание списка, чтобы получить ответ:

 dict1 = {"EX1": "C", "EX2": "D", "EX4": "A", "EX5": "A"}
dict2 = {"EX1": "C", "EX2": "A", "EX3": "A", "EX4": "A", "EX5": "A"}

# (count matching keys)*3 - (count not matching keys)
ttl = len([k for k in dict1 if k in dict2 and dict1[k]==dict2[k]]) * 3 - len([k for k in dict1 if k in dict2 and dict1[k]!=dict2[k]])

print(ttl)  # 8
  

Ответ №2:

вы можете использовать следующую функцию, которая также поддерживает вложенные словари:

 def is_dict_equal(d1, d2):
    # for each key in d1
    for key in d1.keys():
        # check if d2 also has the key
        if key not in d2:
            return False

        value1 = d1.get[key]
        value2 = d2.get[key]
        if isinstance(value1, dict): # if the value is another dictionary call this function again
            if not is_dict_equal(value1, value2):
                return False
        elif value1 != value2: # else just compare them with eachother
            return False

    # check for keys in d2 but not in d1
    for key in d2.keys():
        if key not in d1:
            return False

    return True
  

Ответ №3:

 count = 0
for key in (set(dict1.keys()) amp; set(dict2.keys())):
    if dict1.get(key) == dict2.get(key):
        count  = 3
    else:
        count -= 1
print(f"count = {count}")

#count = 8
  

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

1. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут голоса.