Python Словарь Родительских Детей Карта - PullRequest
0 голосов
/ 18 сентября 2018

Мне трудно создать словарь родительских дочерних флагов.

У меня есть словарь, подобный следующему:

d = {
'A': ['Blue'],
'B': ['A'],
'C': ['A'],
'D': ['C'],
}

Это моя логика или мыслительный процесс: если ключявляется 'Blue', это родитель и получает флаг 0.Если value находится в d.keys(), он получает флаг 1.То, где я застреваю, находится на внуках.Вот код, который у меня есть сейчас, и это результат того, что я уже много часов бьюсь головой о фигуративную стену.

level = 0
while level < 1000:
    for key, value in d.items():
        if value[0] == 'Set':
            if len(value) == 1:
                value.extend([level])
        elif len(value) >= 2:
            continue
        elif value[0] in d.keys():
            value.extend([level])
        level += 1

Результат:

A:      ['Blue', 0]
B:      ['A', 1]
C:      ['A', 2]
D:      ['D', 3]

D является внуком C и должен иметь флаг 2, а C является потомкомA и должно иметь значение 2, как и у другого ребенка, B.

Цель этого - создать правильные флаги независимо от того, сколько у них уровней внуков или правнуков.

Большей картиной здесь является использование этих данных для вставки вложенных циклов.У меня есть странная база данных, и я должен использовать определенный проприетарный модуль для перебора справочных таблиц, которые доступны для меня через атрибуты класса.Итак, код будет

while parent:
    ...block of code for parent...
    ...insert same structure here if not the parent... 
    ...statement at end of parent block...

Итак, дочерний цикл может выглядеть так:

while parent:
    ...block of code for parent...
    while child:
       ...block of code for child...
       ...variable for block insertion...
       ...statement at end of child block...
    ...statement at end of parent block...

...statement at end of parent/child block... аналогичен next(), но с использованием проприетарного модуляМне нужно использовать для этого.

Итак, mapper должен использоваться для того, чтобы программа знала, сколько вложенных циклов while нужно создать с использованием этой структуры.Я не вставлял вложенные блоки, но знаю, что это можно сделать.:)

Мне бы очень хотелось узнать у кого-то, кто может объяснить, как создать часть картографа.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018
d = {
  'A': ['Blue'],
  'B': ['A'],
  'C': ['A'],
  'D': ['C'],
}

output = {}
for k, v in d.items():
    output[v[0]] = output.get(v[0], [])
    output[v[0]].append(k)

output
#=> {'Blue': ['A'], 'A': ['C', 'B'], 'C': ['D']}
0 голосов
/ 18 сентября 2018

Этот код изменяет существующий словарь child: parent, добавляя флаги глубины в конец каждого списка.Он будет работать правильно (как в Python 2, так и в Python 3) независимо от того, в каком порядке обрабатываются ключи. В версиях, предшествующих Python 3.6, словари не обязательно сохраняют порядок вставки ключей, и порядок ключей может изменяться от одногопрогон программы к следующему.Поэтому я немного расшифровал записи, чтобы убедиться, что они работают должным образом.

src = {
    'D': ['C'],
    'B': ['A'],
    'A': ['Blue'],
    'C': ['A'],
}

def get_depth(d, k):
    v = d[k]
    if len(v) == 2:
        return v[1]
    else:
        parent = v[0]
        depth = 0 if parent == 'Blue' else get_depth(d, parent) + 1
        v.append(depth)
        return depth

for k in src:
    get_depth(src, k)

print(src)    

Выход Python 3.6

{'D': ['C', 2], 'B': ['A', 1], 'A': ['Blue', 0], 'C': ['A', 1]}
0 голосов
/ 18 сентября 2018

Я не уверен, что полностью понимаю ожидаемый результат, но в любом случае это может помочь

for key, value in d.items():
    if value[0] == 'Set':
        if len(value) == 1:
            value.extend([0])
    elif len(value) >= 2:
        continue
    elif value[0] in d.keys():
        newlevel = d[value[0]][1] + 1
        value.extend([newlevel])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...