[英]Convert dict with mixed values to flat dict
我想遍歷一個dict,它的值是列表,unicode字符串,dict,bool和ints的混合,以生成具有所有鍵值對的一維dict。 我不在乎保留關聯值是字典的鍵。
我嘗試了遞歸函數,但缺少一些步驟。 也許我需要在某處使用.update()
或+=
?
def unravel(data):
resultsdict = {}
for k in data:
if isinstance(data[k],dict):
unravel(data[k])
else:
resultsdict[k] = data[k]
我的頂級dict值的示例:
<type 'list'>
<type 'bool'>
<type 'dict'>
<type 'unicode'>
<type 'bool'>
<type 'unicode'>
<type 'dict'>
<type 'int'>
<type 'unicode'>
您已經快到了,但是您需要返回創建的字典,並使用遞歸調用返回的值更新字典:
def unravel (data):
d = {}
for k, v in data.items():
if isinstance(v, dict):
d.update(unravel(v))
else:
d[k] = v
return d
像這樣使用:
>>> unravel({ 'a': { 'b': 'c', 'd': 'e' }, 'f': 'g', 'h': { 'i': 'j' } })
{'f': 'g', 'i': 'j', 'b': 'c', 'd': 'e'}
你的方法unravel
創建的新實例resultsdict
每次遞歸調用它。 因此,並不是說所有數據都進入主字典。 嘗試這樣的事情:
def unravel(data, resultsdict={}):
for k in data:
if isinstance(data[k],dict):
unravel(data[k], resultsdict)
else:
resultsdict[k] = data[k]
return resultsdict
在這樣的遞歸方案中,每次遞歸時,都應隨身攜帶可變數據結構。
您可以打開所有字典元組的包裝,然后將整個東西弄平
# Turn every key,value pair into a list of tuples
# [(key, value)] if it's any datatype but dict
# value.iteritems() otherwise
grouped_key_value_pairs = [v.iteritems() if isinstance(v,dict) else [(k,v)] for k,v in data.iteritems()]
# Flatten into a single list of tuples and turn into dict!
result = dict([kv_pair for group in all_kv_pairs for kv_pair in group])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.