переключение ключей и значений в словаре в python - PullRequest
40 голосов
/ 29 ноября 2011

Скажите, у меня словарь такой:

my_dict = {2:3, 5:6, 8:9}

Есть ли способ, которым я могу переключать ключи и значения, чтобы получить:

{3:2, 6:5, 9:8}

Ответы [ 10 ]

70 голосов
/ 29 ноября 2011
my_dict2 = dict((y,x) for x,y in my_dict.iteritems())

Если вы используете python 2.7 или 3.x, вы можете вместо этого использовать словарное понимание:

my_dict2 = {y:x for x,y in my_dict.iteritems()}

Edit

Как отмечено в комментариях JBernardo, для python3.x вам нужно использовать items вместо iteritems

6 голосов
/ 29 ноября 2011

Используйте этот код (тривиально измененный) из принятого ответа на Python перевернуть / инвертировать отображение :

dict((v,k) for k, v in my_dict.iteritems())

Обратите внимание, что это предполагает, что значения в исходном словаре являются уникальными. В противном случае вы получите дубликаты ключей в результирующем словаре, что недопустимо.

И, как указывает @wim, также предполагается, что значения могут быть хэшируемыми. См. глоссарий Python , если вы не уверены, что есть и что нельзя хэшировать.

6 голосов
/ 29 ноября 2011

Попробуйте это:

my_dict = {2:3, 5:6, 8:9}

new_dict = {}
for k, v in my_dict.items():
    new_dict[v] = k
5 голосов
/ 29 ноября 2011

может быть:

flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))

2 голосов
/ 29 июля 2016

Иногда условие, что все значения уникальны, не выполняется, и в этом случае ответы выше уничтожат любые дублирующиеся значения.

Следующее сворачивает значения, которые могут быть дубликатами, в список:

from itertools import count
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())])

Я уверен, что есть лучший метод (не из списка), но у меня возникла проблема с более ранними ответами, поэтому я подумал, что я предоставлю свое решение на случай, если другие будут использовать подобное-дело.

PS Не ожидайте, что дикт будет оставаться аккуратно сложенным после любых изменений в оригинале!Этот метод используется только один раз при статическом диктанте - вы были предупреждены!

1 голос
/ 15 марта 2019

Вы можете сделать это так:

Функция:

def inverse_dict(my_dict):
    updated_dict = {}

for i in my_dict:
    updated_dict[my_dict[i]] = [i]

return updated_dict

Main ():

def main():
    year = {'day': 15, 'month': 3, 'year': 2019}
    print(inverse_dict(year))

if __name__ == "__main__":
    main()

Ouput:

{15: ['day'], 3: ['month'], 2019: ['year']}
1 голос
/ 23 декабря 2018

Если значения не являются уникальными, это приведет к столкновению ключевого пространства при преобразовании. Лучше всего сохранять ключи в списке при переключении мест

ниже обрабатывает это -

RvsD = dict()
for k,v in MyDict.iteritems():
    RsvD.setdefault(v, []).append(k)
1 голос
/ 19 января 2018

Прежде всего, не гарантирует, что это возможно, так как значения словаря могут быть неисчерпаемыми.

В противном случае мы можем использовать функциональный подход с:

reversed_dict = dict(map(reversed, original_dict.items()))
1 голос
/ 19 июля 2016
my_dict = { my_dict[k]:k for k in my_dict}
0 голосов
/ 23 июня 2019

Если значения не являются уникальными в словаре, вы можете сопоставить ключи с этим значением.Вот пример того, как это сделать, используя defaultdict

from collections import defaultdict


def reverse_dict(data: dict) -> dict:
    rd = defaultdict(list)
    for k, v in data.items():
        rd[v].append(k)
    return rd


if __name__ == "__main__":
    from collections import Counter

    data = "aaa bbb ccc ddd aaa bbb ccc aaa"
    c = Counter(data.split())
    print(c)
    # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
    rd = reverse_dict(c)
    print(rd)
    # defaultdict(<class 'list'>, {3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd']})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...