Сохранить уровень вложенных ключей для рекурсивной функции dict? - PullRequest
1 голос
/ 28 февраля 2020

У меня есть рекурсивная функция, которая берет все ключи из словаря python независимо от уровня вложенности. Хотя это прекрасно работает, я пытаюсь отслеживать уровень вложенности для каждого ключа одновременно. Какой-то счетчик, но не уверен, как это реализовать. Ниже приведено то, что у меня есть:

d = {"12": "a", 
    "3": "b", 
    "8": {
        "12": "c", 
        "25": "d"
    }
}


keys_list = []

def iterate(dictionary):
    for key, value in dictionary.items():
        if key not in keys_list:
            keys_list.append(key)
        if isinstance(value,dict):
            iterate(value)
            continue

iterate(d)

Это возвращает:

keys_list = ['12', '3', '8', '25']

Прямо сейчас вложенная "12" игнорируется, потому что она уже есть в списке, но мне нужно своего рода уникальный идентификатор для вторых 12, так что он тоже включен. Есть мысли?

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете добавить depth аргумент к вашей рекурсивной функции:

d = {"12": "a",
    "3": "b",
    "8": {
        "12": "c",
        "25": "d"
    }
}


keys_list = []

def iterate(dictionary, depth=0):
    for key, value in dictionary.items():
        if key not in keys_list:
            keys_list.append((key, depth))
        if isinstance(value,dict):
            depth += 1
            iterate(value, depth)
            continue

iterate(d)

print(keys_list)

Вывод:

[('12', 0), ('3', 0), ('8', 0), ('12', 1), ('25', 1)]

Это дает список кортежей, где первое значение в каждом кортеже является ключом, а второе значение является глубиной.

РЕДАКТИРОВАТЬ

приведенный ниже код должен охватывать различные случаи более надежно, чем код выше (но я изменил ваш несколько итеративная функция):

d = {"12": "a",
    "3": "b",
    "8": {
        "12": "c",
        "25": "d"
    },
    "test":"a"
}
KEYS = []
DEPTH = 0  # keep counter updated globally too
def iterate(dictionary):
    global DEPTH
    for key, value in dictionary.items():
        KEYS.append((key, DEPTH))
        if isinstance(value, dict):
            DEPTH += 1
            iterate(value)
    DEPTH = 0

iterate(d)
print(KEYS)

Вывод:

[('12', 0), ('3', 0), ('8', 0), ('12', 1), ('25', 1), ('test', 0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...