Как проверить, является ли словарь обратимым - PullRequest
0 голосов
/ 08 ноября 2019

Я работаю над вопросом, который требует указать на проблему в функции, которая определяет, является ли словарь обратимым (для каждого значения, появляющегося в словаре, есть только один ключ, который сопоставляется с этим значением) или нет. Вопрос ниже:

def is_invertible(adict):
    inv_dict = make_inv_dict(adict)
    return adict == inv_dict

def make_inv_dict(adict):
    if len(adict) > 0:
       key, val = adict.popitem()
       adict = make_inv_dict(adict)
       if val not in adict.values():
          adict[key] = val
       return adict
    else:
        return {}

В настоящее время возвращается False для {'a': 'b', 'b': 'e', 'c': 'f'}, когда предполагается, что он равен True. Я уверен, что есть проблема в функции make_inv_dict;это просто потому, что adict не является подходящим именем переменной в adict = make_inv_dict(adict)? Или есть другая причина, по которой функция возвращает неверный результат?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

По крайней мере три проблемы с данной функцией:

  1. Условие adict == inv_dict проверяет, является ли словарь его собственным обратным , а не просто обратимым.
  2. Он использует pop_item для удаления пары ключ / значение из входного словаря, а затем вставляет ее назад, чтобы функция работала на месте. К тому времени, когда он закончится, исходное содержимое adict будет полностью уничтожено, поэтому сравнение все равно будет бессмысленным.
  3. Строка 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
1 голос
/ 08 ноября 2019

Мой ответ:

def is_invertible(dict_var):
    return len(dict_var.values()) == len(set(dict_var.values()))
...