Рубрики
Без рубрики

Реальный использование для использования рекурсии

Я никогда не использовал рекурсию, и я никогда не думал, что буду. До сих пор петли было достаточно. … Теги с Python, учебник.

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

Соревнование

  1. Учитывая Dict/список (объект), давайте назовем это щиток приборов
  2. Поиск диктопов в Приборная панель который обладает данным ключом, «EXPR» в моем случае
  3. Каждый раз, когда вы найдете Dict с этим ключом, добавьте значение за этой клавишей в список и продолжайте поиск через щиток приборов
  4. Приборная панель Содержит неизвестное количество диктовых и списков, которые вложены, и вы на самом деле не знаете структуру этого щиток приборов , это совершенно неизвестно до времени выполнения

Данные, работающие над – Grafana Node-Exporter Dashboard – https://grafana.com/api/dashboards/1860/Revisions/19/download (JSON File)

Решение

  1. Я использовал JSON Чтобы импортировать файл и сохранить данные файла в переменной под названием щиток приборов
  2. Я обнаружил, что мне нужно написать тонны петель, которые не имели смысла, поэтому я думал, что рекурсия может быть решением для этого .. И это было!
  3. Я позвонил в функцию get_expressions. Но вы можете назвать это чем угодно ты хочешь

Вот код

import json

with open("node-exporter-full_rev19.json", "r") as file:
    dashboard = json.load(file)


def get_expressions(obj, search_key, my_list=[]):
    if isinstance(obj, list) and len(obj):
        for item in obj:
            get_expressions(item, search_key, my_list)
    elif isinstance(obj, dict):
        if search_key in obj and obj[search_key]:
            return my_list.append(obj[search_key])
        else:
            for key, value in obj.items():
                if (isinstance(value, list) or isinstance(value, dict)):
                    get_expressions(value, search_key, my_list)
    return my_list


result = get_expressions(dashboard, "expr")
pretty_result = json.dumps(result, indent=2, sort_keys=True)
print(pretty_result)
Output
[
...
"node_memory_Shmem_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
"node_memory_ShmemHugePages_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
"node_memory_SUnreclaim_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
"node_memory_SReclaimable_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
"node_memory_VmallocChunk_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
"node_memory_VmallocTotal_bytes{instance=~\"$node:$port\",job=~\"$job\"}",
...
]

Объяснение

  1. Функция получает объект (Dict/list/int/jove) и проверяет, если это непустой список, а затем для каждого элемента в этом списке он выполняет ту же функцию (рекурсион)
  2. Как только звонок на obj Тип диктома (Элиф), мы проверяем Если search_key находится в дикторе, если это, ура, добавьте к мой список (начинается как пустой список) и вернуть my_list (состояние остановки)
  3. (остальное в Элифу) Если search_key Не находится в диктоме, нам нужно пройти все ключи в диктоме (так же, как мы сделали в списке), если значение в Dict – это тип списка или Dict, выполнить функцию снова (рекурсион)
  4. В конце концов вернуться my_list который начинается как пустой список по умолчанию и заканчивается списком значений, которые мы искали (состояние остановки)

Я надеюсь, что это было достаточно ясно …:)

Оригинал: “https://dev.to/unfor19/i-used-a-recursion-here-s-why-and-how-i-solved-it-1b0m”