Извлечь определенные c словарей из списка вложенных словарей во временный список - PullRequest
0 голосов
/ 29 мая 2020

Я изо всех сил пытался извлечь из списка словарей значение «0» и добавить их во временные словари.

Я пробовал это:

new_users = [{'user1':{'book1':'0', 'book2':'4', 'book3':'1'}},{'user2':{'book1':'5', 'book2':'1', 'book3':'0'}}]
    def approachA():
        for data in new_users:          # new_users is a list of nested dictionaries
            if data == '0':
                 print("found 0")
                 keys = data.keys()
                 for key in keys:
                     if key == '0':
                        key.pop() # tried to deleted delete the elements at first

Это по какой-то причине не сработало, и я пытался сделать это в течение 2 часов, поэтому, пожалуйста, не задавайте вопросов, не связанных с проблемой.

Это простая версия того, что я пытаюсь сделать:

[{'user1':{'book1':'0', 'book2':'4', 'book3':'1'}},{'user2':{'book1':'5', 'book2':'1', 'book3':'0'}}] -> [{'user1':{'book1':'0'}}, {'user2':{'book3':'0'}}]

Таким образом, в основном ключи со значением «0» копируются во временный список словарей.

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Это должно выполнить sh фрагмент "sample". Пожалуйста, дайте дополнительную информацию, если это не то, что вы пытались сделать.

def solve_nested(nested_dict: list) -> list:
    result = list()
    for dictionary in nested_dict:
        for k, v in dictionary.items():
            for _k, _v in v.items():
                if _v == '0':
                    result.append({_k: _v})
    return result


if __name__ == '__main__':
    print(solve_nested([{"name": {"book1": "0", "book2": "1", "book3": "0"}}]))
0 голосов
/ 29 мая 2020

Если вас интересует рекурсия, приведенный ниже пример должен помочь вам:

# d_xy => x = nest level
#         y = dictionary item in nest level x

d = {'d_00' : {'d_10' : {'d_20' : 0,
                         'd_21' : 43,
                         'd_22' : 12},
               'd_11' : 4,
               'd_12' : 0,
               'd_13' : 1},
     'd_01' : 0,
     'd_02' : {'d_14' : {'d_23' : 0,
                         'd_24' : 1,
                         'd_25' : 0},
               'd_15' : 4,
               'd_16' : {'d_26' : 0,
                         'd_27' : {'d_30' : 3,
                                   'd_31' : 0,
                                   'd_32' : {'d_40' : 0},
                                   'd_33' : 0},
                         'd_28' : 1},
               'd_17' : 0}}

important_items = []

def get_0_key_values(dic):

    for key in dic:
        if type(dic[key]) == dict:
            get_0_key_values(dic[key])
        else:
            if dic[key] == 0:
                important_items.append({key : dic[key]})

get_0_key_values(d)

print(important_items)
0 голосов
/ 29 мая 2020

Как я уже упоминал в комментарии, я не уверен, что это решит вашу проблему, но, основываясь на приведенном вами примере преобразования, вот один из способов добиться этого:

LIST_IN = [{"name": {"book1": "0", "book2": "1", "book3": "0"}}]

def proccess(list_in):
    result = []

    for this_dict in list_in:
        for key in this_dict["name"]:
            if this_dict["name"][key] == "0":
                result.append({key: this_dict["name"][key]})

    return result

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