Подтвердить что ты не робот

Ключи переключения и значения в словаре в python

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

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

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

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

Ответ 1

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()}

Изменить

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

Ответ 2

Попробуйте следующее:

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

new_dict = {}
for k, v in my_dict.items():
    new_dict[v] = k

Ответ 3

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

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

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

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

Ответ 4

может быть:

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

Ответ 5

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

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

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())])

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

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

Ответ 6

my_dict = { my_dict[k]:k for k in my_dict}

Ответ 7

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

Если это не так, мы можем использовать функциональный подход с:

reversed_dict = dict(map(reversed, original_dict.items()))

Ответ 8

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

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

RvsD = dict()
for k,v in MyDict.iteritems():
    RsvD.setdefault(v, []).append(k)

Ответ 9

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

Функция:

def inverse_dict(my_dict):
    updated_dict = {}

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

return updated_dict

Главный():

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

if __name__ == "__main__":
    main()

Ouput:

{15: ['day'], 3: ['month'], 2019: ['year']}

Ответ 10

Если значения не являются уникальными в словаре, вы можете сопоставить ключи с этим значением. Вот пример того, как это сделать, используя 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']})