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

Я пытаюсь инвертировать исходный словарь следующей формы:

Dict[str, list[str]] -> Dict[str,list[str]]

Example: INPUT: number_to_letter = {'1': ['A'], '2': ['B'], '3': ['B', 'D']}

OUTPUT expected: letter_to_number = {'A': ['1'], 'B': ['2', '3'], 'D': ['3']}

Код:

inverted = {}

for old_key in key_to_value:
    new_key = key_to_value[old_key]

    if not (new_key in inverted):
        inverted[new_key] = [old_key]
    #o/w append old_key to existing list
    else:
        inverted[new_key].append(old_key)

Что приводит к:

Expected = Dict[str,list[str]]

Error received: TypeError: unhashable type: 'list'

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Где бы вы ни пытались использовать new_key в качестве ключа словаря, попробуйте вместо этого использовать tuple(new_key). tuple является хэшируемым и поэтому может использоваться как ключ словаря, тогда как list - нет и не может.

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

Трудно сказать, что вы пытаетесь сделать без хорошего примера вашего ввода и вывода. Одна из интерпретаций вашей проблемы может быть:

key_to_value = {'2': ['A', 'B', 'C'], '3': ['B', 'C', 'D'], '4': ['C', 'D', 'E']}

inverted = {}

for old_key in key_to_value:
    new_keys = key_to_value[old_key]

    for new_key in new_keys:
        if new_key in inverted:
            inverted[new_key].append(old_key)
        else:
            inverted[new_key] = [old_key]

print(inverted)

ВЫХОД

% python3 test.py
{'A': ['2'], 'B': ['2', '3'], 'C': ['2', '3', '4'], 'D': ['3', '4'], 'E': ['4']}
%
...