Обратный Dict в Python - PullRequest
       13

Обратный Dict в Python

2 голосов
/ 11 сентября 2009

Я пытаюсь создать новый dict, используя список значений существующего dict в качестве отдельных ключей.

Так, например:

dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})

и я хотел бы получить:

dict2 = dict({1:['a','b','c'], 2:['a','b','c'], 3:['a','b'], 4:['b']})

Пока что я не смог сделать это очень чистым способом. Есть предложения?

Ответы [ 3 ]

8 голосов
/ 11 сентября 2009

Если вы используете Python 2.5 или выше, используйте класс defaultdict из модуля collections; defaultdict автоматически создает значения при первом доступе к отсутствующему ключу, так что вы можете использовать это здесь для создания списков для dict2, например:

from collections import defaultdict
dict1 = dict({'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]})
dict2 = defaultdict(list)
for key, values in dict1.items():
    for value in values:
        # The list for dict2[value] is created automatically
        dict2[value].append(key)

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

Если вы хотите получить обычный дикт в конце, который поднимет KeyError для отсутствующих ключей, просто используйте dict2 = dict(dict2) после вышеприведенного.

4 голосов
/ 11 сентября 2009

Обратите внимание, что вам не нужен dict в ваших примерах: синтаксис {} дает вам слово:

dict1 = {'a':[1,2,3], 'b':[1,2,3,4], 'c':[1,2]}
0 голосов
/ 11 сентября 2009

Другой способ:

dict2={}
[[ (dict2.setdefault(i,[]) or 1) and (dict2[i].append(x)) for i in y ] for (x,y) in dict1.items()]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...