Как сравнить два словаря исключая (но не удаляя) один из ключей в Python
Функция 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
Ответы (2 шт):
Автор решения: Алексей Р
→ Ссылка
Можно просто определить условие сравнения, которое не будет учитывать разницу в серийных номерах: 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
Автор решения: Сергей Ш
→ Ссылка
# 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}))