По крайней мере три проблемы с данной функцией:
- Условие
adict == inv_dict
проверяет, является ли словарь его собственным обратным , а не просто обратимым. - Он использует
pop_item
для удаления пары ключ / значение из входного словаря, а затем вставляет ее назад, чтобы функция работала на месте. К тому времени, когда он закончится, исходное содержимое adict
будет полностью уничтожено, поэтому сравнение все равно будет бессмысленным. - Строка
adict[key] = val
вставляет пару ключ / значение в исходном порядке;обратный порядок должен быть adict[val] = key
. Таким образом, эта функция не выполняет то, что обещает ее название, а именно создание обратного словаря.
Следует отметить, что если не для уничтожения словаря (2.), ошибки (1.) и (3.) отменили бы, потому что результатом функции является восстановление исходного словаря, но без повторяющихся значений.
Я предполагаю, что некоторые люди найдут этот вопрос, если ониВы ищете правильный способ инвертировать словарь, поэтому вот один: эта функция возвращает обратный словарь, если это возможно, или None
в противном случае.
def invert_dict(d):
out = dict()
for k,v in dict.items():
if v in out:
return None
out[v] = k
return out
Вспомогательная функция, возвращающая логическое значение для того, является лисловарь обратим:
def is_invertible(d):
return invert_dict(d) is not None