Добавить все ключевые значения в список, которые присутствуют в списке значений словаря - PullRequest
0 голосов
/ 12 февраля 2019

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

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

Чтобы упростить проблему, скажем, что у меня есть такой вот что:

my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}

В my_dict ключ 1 присутствует в значениисписок ключей 3, поэтому мы должны создать новый dict с key = 1 и value = list(3)

Аналогично, ключ 6 присутствует в списках значений ключей 2, 4и 5.Мы создали бы новые key =6 и value = list(2,4,5) в нашем dict.

Вот окончательный вывод для нашего dict:

output_dict = {1: [3], 2: [3], 3: [1], 4: [2,5,6], 5: [2, 4, 6], 6: [2,4,5]}

Мой код пока:

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

for k , v in my_dict.items():
    for k2 in new_dict.keys():
        if k2 in v:
            new_dict[k2].append(k)

Любые указатели очень ценятся.Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Просто для полноты, вот еще одна версия, использующая понимание слова:

from itertools import chain
my_dict = {1: [3], 2: [4,5,6], 3: [1,2], 4: [5,6], 5: [4,6], 6: [4,5]}

vals = set(chain.from_iterable(my_dict.values()))
d = {val:[k for k, v in my_dict.items() if val in v] for val in vals}
0 голосов
/ 12 февраля 2019

Вы можете использовать setdefault до инвертировать словарь:

my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}

new_dict = {}
for key, values in my_dict.items():
    for value in values:
        new_dict.setdefault(value, []).append(key)

print(new_dict)

Выход

{1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]}

идея состоит в том, чтобы перебрать каждую пару (ключ, значения), а затем использовать каждое значение в качестве ключа, setdefault будет обрабатывать случай, когда ключ отсутствует.Альтернативой может быть установка пустого списка в качестве значения по умолчанию для каждого нового ключа в new_dict, например:

# set the empty list for each new key in new_dict
new_dict = {}
for values in my_dict.values():
    for value in values:
        new_dict[value] = []

# fill new_dict
for key, values in my_dict.items():
    for value in values:
        new_dict[value].append(key)

Это приведет к тому же выводу, что и выше, третий вариант будет использовать collection.defaultdict и пропустите первый цикл:

from collections import defaultdict

my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}

new_dict = defaultdict(list)
for key, values in my_dict.items():
    for value in values:
        new_dict[value].append(key)

print(new_dict)

Output

defaultdict(<class 'list'>, {1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]})

Обратите внимание, что это возвращает defaultdict, то есть sub-класс dict.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...