python рекурсия избегает результата как глобальная переменная - PullRequest
0 голосов
/ 26 апреля 2020
res_dict = {}

def get_value(co , passed_dict ):

    for k, v in passed_dict.items():
        if isinstance(v, dict):
            get_value(co, v)
        else:
            res_dict[k] = v
            print("from else",res_dict)

    return res_dict


def easy():

    inner_dict = {
                    "test1" : {"test1_in" : "abc"},
                    "test2" : {"test1_in" : "xyz"}
                  }
    dict1 = {}
    count = 0
    val_from_function= {}
    key_list = ['key1','key2']

    for key in key_list:
        count = count + 1
        val_from_function = get_value(count ,inner_dict)
        print("before assign" ,dict1 )
        dict1[key] = val_from_function
        print("after assign" , dict1)

    # dict1['key1'] = {'test1' : "abc"}
    # dict1['key2'] = {'test1' :  "xyz"}

    print(dict1)

easy() 

  • получение вывода: {'key1': {'test1_in': 'xyz'}, 'key2': {'test1_in': 'xyz'}}
  • ожидается o / p: {'key1': {'test1_in': 'ab c'}, 'key2': {'test1_in': 'xyz'}}

  • I понимать, что значение dict1 обновляется последним значением как res_dict, объявленным как глобальная переменная.

  • Я могу решить эту проблему, добавив значение внутреннего ключа к внешнему ключу и сохранив его в словаре.
  • Я могу решить его, используя упорядоченный словарь.
  • взяв ключи из списка в качестве значения внешнего ключа (key1, key2 .., key3000) неизвестно.

Поиск предложений о том, как улучшить этот код с ожидаемым значением o / p. Имеют значения пары ключей 3k, такие же, как в примере шаблона с большим количеством вложенных k, v и сохранением o / p в качестве кэша, поэтому производительность здесь не является большой проблемой.

1 Ответ

0 голосов
/ 26 апреля 2020
# This modifies passed_dict


def get_value(passed_dict, recur_dict_new={}, isInitial=True):

    for k, v in passed_dict.items():
        if isInitial:
            recur_dict_new = {}
        if isinstance(v, dict):
            temp = get_value(v, recur_dict_new, isInitial=False)
            passed_dict[k]= temp
        else:
            recur_dict_new[k]=v

    return recur_dict_new


def easy():

    inner_dict = {
                    "test1" : {"test1_in" : "abc"},
                    "test2" : {"test1_in" : "xyz"}
                  }

    key_list = ['key1','key2']

    for key in key_list:
        get_value(inner_dict)
    # dict1['key1'] = {'test1' : "abc"}
    # dict1['key2'] = {'test1' :  "xyz"}

    print(inner_dict)

easy()

Спасибо за поиск, я решил одним из упомянутых выше способов, протестировал 15k записей с еще 3 уровнями вложенности JSON, производительность была в порядке (4 мс)

  • O / p: {'test1': {'test1_in': 'ab c'}, 'test2': {'test1_in': 'xyz'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...