#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))