Как бы я в функции создал словарь, ключи которого являются значениями данного словаря, и наоборот, где данный словарь имеет несколько значений на ключ? Например, дан словарь:

d = {"1":["a","b"],"2":["b","a","c"],"3":["c","d"]}

Мне нужно вернуть словарь, как:

d2 = {"a":["1","2"],"b":["1","2"],"c":["2","3"],"d":["3"]}

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

3
Evan 8 Дек 2016 в 15:38

4 ответа

Лучший ответ

Пытаться:

{letter: [key for key in d if letter in d[key]] for letter in set(letter for key in d for letter in d[key])}

Объяснение: set(letter for key in d for letter in d[key]) - это набор всех букв, которые появляются в исходном тексте. Затем мы создаем новый dict, в котором каждая запись является letter: [key for key in d if letter in d[key]], что означает одну из букв, сопоставляемых со списком чисел, которые сопоставлены с ним в исходном dict.

2
kmaork 8 Дек 2016 в 12:46

Легко использовать collections.defaultdict(), который по умолчанию равен list

  • цикл по отсортированной паре ключ / значение
  • внутренний цикл по элементам значения
  • для каждого элемента значения создайте / обновите список с оригинальным ключом dict

Код:

import collections

d3 = collections.defaultdict(list)

for k,v in sorted(d.items()):
    for vi in v:
        d3[vi].append(k)  # create list or append to existing list

print(dict(d3))

Результат:

{'b': ['1', '2'], 'd': ['3'], 'c': ['2', '3'], 'a': ['1', '2']}
1
Jean-François Fabre 8 Дек 2016 в 12:45

Вот решение, которое я нашел 5 лет назад

from operator import itemgetter
from itertools import groupby
d = {'1': ['a', 'c'],'2': ['a', 'b', 'c'], '3': ['b']}
d2 = {x: [t[1] for t in group] for (x, group) in  groupby(sorted(((j, k) for k, v in d.items() for j in v), key=itemgetter(0)), key=itemgetter(0))}
# {'a': ['1', '2'], 'c': ['1', '2'], 'b': ['2', '3']}
0
Gribouillis 8 Дек 2016 в 13:02
data = [(key, value) for key, values in d.items() for value in values]
d2 = defaultdict(list)

for value, key in data:
    d2[key].append(value)
    print(key, value)
0
blue_note 8 Дек 2016 в 12:45