Разворот словаря
Имеется словарь вида:
d = {'one': 'a', 'two': ['b', 'c'], 'three': ['d']}
Необходимо с помощью функций реализовать разворот (смену местами ключа и значения(ий)). Как пример, исходный словарь должен был преобразован так:
d = {'a': 'one', 'b':'two', 'c':'two', 'd':'three'}
Эта же функция должна уметь сворачивать его обратно, чтобы получить исходный словарь. Кроме того, необходимо реализовать разворот одной пары (по ключу). Я смог реализовать разворот в одну сторону, но обратно почему-то не работает. Кроме того, не работает реверс конкретной пары, если в значении содержится список.
def reverse(r):
if r == 'all':
result = {}
for key, value in d.items():
if isinstance(value, list):
for item in value:
result[item] = key
else:
result[value] = key
return result
else:
d[d.pop(r)] = r
print(d)
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Обратно работает, но:
- невозможно отличить случай, когда в ключ преобразована строка, от случая, когда в ключ преобразован список из одной строки, с этим вы ничего не сможете сделать, это необратимое преобразование
- чтобы корректно обработать случай с повторяющимися ключами вам нужно не просто присваивать
result[value] = key, а проверять нет ли уже значения вresult[value], если значение есть, то нужно проверить список ли это, если ещё не список - сделать из него список, а далее добавить в этот список очередное значение
Автор решения: TigerTV.ru
→ Ссылка
Неоптимизированная версия:
def reverse_dict(d):
result = {}
for k, vv in d.items():
if type(vv) is not list:
vv = [vv]
for v in vv:
if v in result:
if type(result[v]) is list:
result[v].append(k)
else:
result[v] = [result[v], k]
else:
result[v] = k
return result
d = {'one': 'a', 'two': ['b', 'c'], 'three': ['d']}
for _ in range(4):
print(d)
d = reverse_dict(d)
Вывод:
{'one': 'a', 'two': ['b', 'c'], 'three': ['d']}
{'a': 'one', 'b': 'two', 'c': 'two', 'd': 'three'}
{'one': 'a', 'two': ['b', 'c'], 'three': 'd'}
{'a': 'one', 'b': 'two', 'c': 'two', 'd': 'three'}