Сумма элементов списка внутри словаря json pytjon

#python #json #dictionary

#python #json #словарь

Вопрос:

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

 {
  "fields": {
    "List1": [
        "List2": [
          {
            "List3": [
              {
                "item": "1",
                "sale": 1149.99
              },
              {
                "item": "2",
        "sale": 20
              }]}]]}}
 

Я использую этот рекурсивный метод для возврата суммы списка:

 def sale_sum(json):
    sale_list=[]
    if isinstance(json, dict):
        for k, v in json.items():
            if k == 'sale':
                sale_list.append(v)
            elif isinstance(v, list):
                for e in v:
                    sale_sum(e)
            elif isinstance(v, dict):
                sale_sum(v)
                
    for i in range(0, len(sale_list)): 
        sale_list[i] = int(sale_list[i]) 
    return sum(sale_list)
 

Но я продолжаю получать 0 от результата. Что не так с кодом? И есть ли лучший способ сделать это?

Обновить:

внес изменения в это и все равно получаю 0. Мне нужен sale_list внутри функции, поэтому я создал вложенную функцию.

 def sale_sum(json):
    sale_list=[]
    
    def list_count(json):
        if isinstance(json, dict):
            for k, v in json.items():
                if k == 'sale':
                    sale_list.append(v)
                elif isinstance(v, list):
                    for e in v:
                        list_count(e)
                elif isinstance(v, dict):
                    list_count(v)
                
    for i in range(0, len(sale_list)): 
        sale_list[i] = int(sale_list[i]) 
            
    return sum(sale_list)
 

Комментарии:

1. Вы рекурсивно вызываете sale_sum() , но игнорируете возвращаемое значение.

2. Вы должны выйти sale_list=[] за пределы функции sale_sum . Он инициализируется как пустой каждый раз, когда вы выполняете всю функцию sale_sum .

3. json также недопустим. Вы можете проверить это с помощью онлайн-анализатора json.

4. @Martin Я поместил sale_list=[] вне функции, но все равно получаю 0

5. Вы никогда не вызываете list_count свой новый код. Поставьте вызов list_count(json) прямо перед for i in range(0, len(sale_list)):

Ответ №1:

 myjson = {
  "fields": {
        "List1": [
            { "List2": [
              {
                "List3": [
                    {
                        "item": "1",
                        "sale": 1149.99
                    },
                    {
                        "item": "2",
                        "sale": 20
                    }
                ]
              }
            ]}
        ]
    }
}


def sale_sum(json):
    sale_list=[]

    def list_count(json):
        if isinstance(json, dict):
            for k, v in json.items():
                if k == 'sale':
                    sale_list.append(v)
                elif isinstance(v, list):
                    for e in v:
                        list_count(e)
                elif isinstance(v, dict):
                    list_count(v)
    list_count(json)
    for i in range(0, len(sale_list)):
        sale_list2[i] = int(sale_list[i])

    return sum(sale_list)

print(sale_sum(myjson))
 

Ответ №2:

Вероятно, это то, что вы ищете.

Обновить:

Вот пример кода

 def find(key, dictionary, sale_list):
    for k, v in dictionary.items():
        if k == key:
            yield dictionary
            sale_list.append(v)
        elif isinstance(v, dict):
            for result in find(key, v, sale_list):
                yield result
        elif isinstance(v, list):
            for d in v:
                if isinstance(d, dict):
                    for result in find(key, d, sale_list):
                        yield result

sale_list = []
list(find("sale", data, sale_list))
print(sum(sale_list))