У меня есть json, который я хотел бы распаковать в pandas dataframe, я могу сделать это, используя следующий код. Есть ли способ изменить код для удаления глобальной переменной?
d = {
"name":"Vertebrates",
"children":[
{
"name":"Mammals",
"children":[
{
"name":"human"
},
{
"name":"chimpanzee"
}
]
},
{
"name":"Birds",
"children":[
{
"name":"chicken"
},
{
"name":"turkey"
}
]
}
]
}
path = []
def unpack(d):
global path
if len(d) == 1:
yield(d['name'], path)
else:
path.append(d['name'])
for item in d['children']:
yield from unpack(item)
path = path[:-1]
pd.DataFrame.from_dict({key:value for key, value in unpack(d)},orient='index')
EDIT:
Я фактически начал с пути в качестве аргумента ключевого слова, проблема заключалась в том, что я получил это:
(«человек», [«позвоночные», «млекопитающие»])
(«шимпанзе», [«позвоночные», «млекопитающие»])
(«курица», [«позвоночные», «млекопитающие», «птицы»])
(«индейка», [«позвоночные», «млекопитающие», «птицы»])
где для курицы и индейки путь еще имеет слово млекопитающие,
потому что строка: "путь = путь [: - 1]" была бесполезна в этом коде. поэтому я решил использовать глобальную переменную, чтобы удостовериться, что удаляю последний элемент всякий раз, когда ветвь в рекурсии заканчивается.
РЕШИТЬ:
Ответ blhsing может решить проблему, удалив функцию добавления. Ответ bigwillydos также помогает.
Я не знал, что в рекурсиях обновления переменных эффективны в прямом направлении, но неэффективны в обратном направлении. вот почему я получал накопленный путь для более поздних имен.