簡體   English   中英

將嵌套字典轉換為元組列表

[英]Convert a nested dictionary into list of tuples

我有一dictionary ——

d={'revenues':
             {
              '201907':
                      {'aaa.csv':'fdwe34x2'},
              '201906':{'ddd.csv':'e4c5q'}
             },    
   'complaints':
             {'2014':
                    {'sfdwa.csv','c2c2jh'}
             }
  }

我想把它轉換成tuples list -

[
 ('revenues','201907','aaa.csv','fdwe34x2'),
 ('revenues','201906','ddd.csv','e4c5q'),
 ('complaints','2014','sfdwa.csv','c2c2jh')
]

我嘗試使用list comprehensions ,但沒有幫助 -

l = [(k,[(p,q) for p,q in v.items()]) for k,v in d.items()]
print(l)
    [('revenues', [('201907', {'aaa.csv': 'fdwe34x2'}), ('201906', {'ddd.csv': 'e4c5q'})]),
     ('complaints', [('2014', {'c2c2jh', 'sfdwa.csv'})])]

有什么建議?

如果您不確定此列表可能有多少個級別,則似乎您需要的是遞歸:

def unnest(d, keys=[]):
    result = []
    for k, v in d.items():
        if isinstance(v, dict):
            result.extend(unnest(v, keys + [k]))
        else:
            result.append(tuple(keys + [k, v]))
    return result

友情提示:在 Python 3.6 之前,不維護 dict 順序。

[('complaints', '2014', 'sfdwa.csv', 'c2c2jh'),
 ('revenues', '201906', 'ddd.csv', 'e4c5q'),
 ('revenues', '201907', 'aaa.csv', 'fdwe34x2')]

您可以遍歷字典的級別:

[(x, y, z) for x in d for y in d[x] for z in d[x][y]]

您可以使用列表推導式來完成,但它會非常復雜,如果結構發生變化,也不容易維護。 除非您特別需要良好的性能,否則我建議使用通用遞歸函數:

def unnest(d, keys=[]):
    result = []
    if isinstance(d, dict):
        for k, v in d.items():
            result.extend(unnest(v, keys + [k]))
    elif isinstance(d, list):
        result.append(tuple(keys + d))
    elif isinstance(d, set) or isinstance(d, tuple):
        result.append(tuple(keys + list(d)))
    else:
        result.append(tuple(keys + [d]))
    return result

作為獎勵,除了提供的示例中的集合之外,我還在遞歸期間支持列表和元組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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