Разворачивание значений в словаре по ключу через функцию
У меня есть словарь вида d = {'foo': 'bar', 'spam': ['eggs', 'test']}.
Необходимо с использованием функции (не lambda) осуществить смену местами ключа и значения(ий) таким образом, чтобы из исходных данным получилось такая картина:
d = {'bar':'foo', 'eggs': 'spam', 'test': 'spam'}
Как сделать "разворот" ключа с одним значением мне понятно:
def f(k):
d[d.pop(k)] = k
print(d)
f('foo')
Вполне ожидаемо получаем:
{'spam': ['eggs', 'test'], 'bar': 'foo'}
Но вот с несолькими значениями у одного ключа уже возникают проблемы и на вызов функции:
f('spam') мы получаем ошибку:
TypeError: unhashable type: 'list'
Как это можно исправить?
Ответы (1 шт):
Если в лоб, то можно проверять тип данных, который лежит под ключом и если это список, то прогонять по всем значениям данного списка. Как то так:
d = {'foo': 'bar', 'spam': ['eggs', 'test']}
def f(inn:dict) -> dict:
result = {}
for key, value in inn.items():
if isinstance(value, list):
for item in value:
result[item] = key
else:
result[value] = key
return result
f(d)
# out
# {'bar': 'foo', 'eggs': 'spam', 'test': 'spam'}
И я все-таки сторонник не использовать внешние переменные в функции, а передавать данные через параметры и возвращать результат. Снимает ответственность с функции за внешними изменения и в дальнейшем ее можно использовать как черный ящик, без привязки к внешним изменениям