簡體   English   中英

將具有混合值的字典轉換為平面字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM