Как сравнить два словаря исключая (но не удаляя) один из ключей в Python

Рейтинг: 0Ответов: 2Опубликовано: 20.01.2023

Функция compare_robots, принимает два словаря с характеристиками роботов и возвращает True, только если все характеристики обоих роботов совпадают (порядок свойств не важен, только ключи и значения).

Примечание: у каждого робота есть ключ - уникальный серийный номер (не учитываем при сравнении)

Написал функцию, но указал удаление ключей, не пропускает так как автотесты требуют что бы ключи не учитывались, но не удалялись.

def compare_robots(robot1: dict, robot2: dict) -> bool:
    if robot1.get("serial_no"):
        del robot1["serial_no"]
    if robot2.get("serial_no"):
        del robot2["serial_no"]

    if robot1 == robot2:
        return True
    else:
        return False

Ответы

▲ 1Принят
# 1
def compare_robots(robot1: dict, robot2: dict) -> bool:
    for rab1, rab2 in zip(robot1.items(), robot2.items()):
        if rab1[0] == "serial_no":
            continue
        if rab1 != rab2:
            return False
    return True

# 2
def compare_robots(robot1, robot2):
return all(rab1 == rab2 for rab1, rab2 in zip(robot1.items(), robot2.items()) if rab1[0] != "serial_no")

print(compare_robots({"serial_no": 123, 'power': 100, 'velocity': 200},
                     {"serial_no": 321, 'power': 100, 'velocity': 200}))
print(compare_robots({"serial_no": 123, 'power': 100, 'velocity': 200},
                     {"serial_no": 321, 'power': 120, 'velocity': 200}))
▲ 1

Можно просто определить условие сравнения, которое не будет учитывать разницу в серийных номерах: k != 'serial_no' and v != robot2.get(k). А все элементы словаря перебрать в цикле.

def compare_robots(robot1: dict, robot2: dict) -> bool:
    if set(robot1) != set(robot2):  # проверяем, одинаковый ли набор ключей
        return False
    for k, v in robot1.items():  # проверяем в цикле значения по каждому ключу, ...
        if k != 'serial_no' and v != robot2.get(k):  # ... кроме серийного номера
            return False
    return True  # если все тесты пройдены успешно (не было возврата из функции в ходе проверок), то возвращаем истину


print(compare_robots({"serial_no": 123, 'power': 100, 'velocity': 200},
                     {"serial_no": 321, 'power': 100, 'velocity': 200}))
print(compare_robots({"serial_no": 123, 'power': 100, 'velocity': 200},
                     {"serial_no": 321, 'power': 120, 'velocity': 200}))
True
False