Я получаю словарь в качестве входных данных и хочу вернуть словарь, ключи которого будут входными значениями, а значение - соответствующими входными ключами. Ценности уникальны.
Например, скажем, я ввел:
a = dict()
a['one']=1
a['two']=2
Я бы хотел, чтобы мой результат был:
{1: 'one', 2: 'two'}
Чтобы уточнить, я хотел бы, чтобы мой результат был эквивалентом следующего:
res = dict()
res[1] = 'one'
res[2] = 'two'
Любой аккуратный питонический способ добиться этого?
python
dictionary
Рои Адлер
источник
источник
Ответы:
Python 2:
Python 3 (спасибо @erik):
источник
[
и]
. Разве для понимания списка не требуется[
и]
?источник
Начиная с Python 2.7, включая 3.0+, существует, возможно, более короткая и более читаемая версия:
источник
источник
Вы можете использовать dict-понимание :
Отредактировано: для Python 3 используйте
a.items()
вместоa.iteritems()
. Обсуждения различий между ними можно найти в iteritems в Python на SO.источник
Вы можете попробовать:
Помните, что вы не можете "перевернуть" словарь, если
{'one':1,'two':1}
. В новом словаре может быть только один элемент с ключом1
.{'one':[1]}
.[1]
- допустимое значение, но не действительный ключ.См. Эту ветку в списке рассылки python для обсуждения этой темы.
источник
res = dict(zip(a.values(), a.keys()))
источник
или даже лучше, но работает только в Python 3:
источник
Текущий ведущий ответ предполагает, что значения уникальны, что не всегда так. Что делать, если значения не уникальны? Вы потеряете информацию! Например:
возвращается
{2: 'b', 3: 'a'}
.Информация о
'c'
была полностью проигнорирована. В идеале должно было быть что-то вроде{2: ['b','c'], 3: ['a']}
. Это то, что делает нижняя реализация.Python 2.x
Python 3.x
источник
Еще один способ расширить ответ Ильи Прокина - это фактически использовать
reversed
функцию.По сути, ваш словарь повторяется (с использованием
.items()
), где каждый элемент является парой ключ / значение, и эти элементы меняются местами сreversed
функцией. Когда это передаетсяdict
конструктору, он превращает их в пары значение / ключ, которые вам нужны.источник
Предложение по улучшению ответа Хавьера:
Вместо того,
d.keys()
чтобы написать простоd
, потому что если вы пройдете по словарю с итератором, он вернет ключи соответствующего словаря.Ex. для этого поведения:
источник
Это легко сделать с пониманием словаря:
источник
.items()
возвращает список кортежей(key, value)
.map()
проходит по элементам списка и применяетсяlambda x:[::-1]
к каждому его элементу (кортежу), чтобы отменить его, так что каждый кортеж становится(value, key)
в новом списке, выплевывающемся из карты. Наконец,dict()
делает диктант из нового списка.источник
lambda x:[::-1]
к каждому его элементу (кортежу), чтобы отменить его, так что каждый кортеж становится (значением, ключом) в новом списке, выплевывающемся из карты. Наконец, dict () делает диктант из нового списка.Использование цикла : -
источник
Если вы используете Python3, он немного отличается:
источник
Добавление решения на месте:
В Python3 очень важно использовать,
list(d.keys())
потому чтоdict.keys
возвращает представление ключей. Если вы используете Python2, этогоd.keys()
достаточно.источник
Ответ Ханана правильный, поскольку он охватывает более общий случай (другие ответы вводят в заблуждение тех, кто не подозревает о повторяющейся ситуации). Улучшение ответа Ханана - использование setdefault:
источник