Как проверить, существует ли ключ в значениях и значения в ключе в Python - PullRequest
0 голосов
/ 24 октября 2018

Мне нужна помощь с повторением словаря.Это может быть не очень разумный способ, но мне нужно попробовать.

У меня есть такой запрос:

{'a': 'b', 
 'b': 'c', 
 'c': 'd', 
 'm':'n', 
 'p':'r', 
 'r': 't'}

Когда мне нужно в качестве вывода, это может быть dict или dataframe:

'a' : ['b', 'c', 'd'], 
'b' : ['c', 'd'],
'c': ['d'],
'm': ['n'],
'p': ['r', 't'],
'r': ['t']

Я пытался с:

dict_output = {}
for k, v in my_dict.items():
    lista = []
    for ki, va in my_dict.items():
        if v in ki:
            lista.append(va)
    dict_l.update({k:lista})

Но это повторяется только один раз, я не знаю, как повторить все заново до разрыва цепи.

Редактировать: enter image description here

1 Ответ

0 голосов
/ 24 октября 2018

Определите небольшую функцию (скажем, get_key) для рекурсивного обхода словаря (скажем, oct) и yield клавиш по очереди:

def get_key(dct, key):
    while key in dct:
        key = dct[key]
        yield key

Теперь создайте свой новый словарь с помощьювызов get_key внутри понимания слова.

{k : list(get_key(dct, k)) for k in dct}
{'a': ['b', 'c', 'd'],
 'b': ['c', 'd'],
 'c': ['d'],
 'm': ['n'],
 'p': ['r', 't'],
 'r': ['t']}

Обработка циклов
Обратите внимание, что это не закончится, если у вашего "графа" есть циклы (a:b и b: a). Вы можете исправить это, поддерживая набор visited узлов:

def get_key_handle_cycles(dct, key):
    visited = set()
    while key in dct and key not in visited:
        visited.add(key)
        key = dct[key]

        yield key

И вызывайте эту функцию таким же образом.

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