[英]Flattened and Convert list of Nested Dictionary to Pandas Dataframe
[英]Convert flattened dictionary to nested dictionary
這是我的扁平化字典:
d={"QR": "", "Customer Details": "",
"feature prompt": "something", "chain": "lee", "store": "levis"}
我想要 output 作為嵌套字典; 每個空字符串值代表一個新字典的開始。 所需的 output:
{
"QR": {
"Customer Details": {
"feature prompt": "something",
"chain": "lee",
"store": "levis"
}
}
}
我的代碼:
d={"QR": "", "Customer Details": "",
"feature prompt": "something", "chain": "lee", "store": "levis"}
def nest_dict(d):
result={}
for k,v in d.items():
split(k,v,result)
#print(k)
#print(v)
return result
def split(k,v,out):
if v=='':
split(k,v,out.setdefault(k,{}))
else:
out[k]=v
nest_dict(d)
但是,這給了我一個RecursionError
:
Traceback (most recent call last):
File "/Users/asmita/so_test/test.py", line 18, in <module>
print(nest_dict(d))
File "/Users/asmita/so_test/test.py", line 7, in nest_dict
split(k,v,result)
File "/Users/asmita/so_test/test.py", line 14, in split
split(k,v,out.setdefault(k,{}))
File "/Users/asmita/so_test/test.py", line 14, in split
split(k,v,out.setdefault(k,{}))
File "/Users/asmita/so_test/test.py", line 14, in split
split(k,v,out.setdefault(k,{}))
[Previous line repeated 994 more times]
File "/Users/asmita/so_test/test.py", line 13, in split
if v=='':
RecursionError: maximum recursion depth exceeded in comparison
您的split
方法在無限循環中調用自身,這會導致RecursionError
。 為此,您實際上根本不需要遞歸。 只需保留對當前“層”的引用,並在每次需要添加新字典時重新分配它。
d = {
'QR': '',
'Customer Details': '',
'feature prompt': 'something',
'chain': 'lee',
'store': 'levis',
}
def nest_dict(flat_dict):
current_level = result = {}
for key, value in flat_dict.items():
if value:
current_level[key] = value
else:
current_level[key] = {}
current_level = current_level[key]
return result
print(nest_dict(d))
Output:
{'QR': {'Customer Details': {'feature prompt': 'something', 'chain': 'lee', 'store': 'levis'}}}
如果你確實想使用遞歸,你可能希望你的主 function 調用自己,而不是委托給第二個 function 來調用它自己。 在此實現中,當您遇到空白值時,function 會調用自身,為子調用提供一個刪除了當前鍵的字典版本(然后中斷其循環,因此它不會對每個后續鍵進行雙重處理)。
def nest_dict(flat_dict):
result = {}
for key, value in flat_dict.items():
if value:
result[key] = value
else:
result[key] = nest_dict(
{k:v for k, v in flat_dict.items() if k != key}
)
break
return result
遞歸編程有兩個主要缺陷:
RecursionError
(以防止堆棧溢出)。第二個問題不太可能成為這里的一個因素,除非你的字典真的很大; 遞歸限制通常設置為 1,000 。 首先,您的里程可能會有所不同。 如果不出意外,嘗試一下會很有趣!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.