簡體   English   中英

如何用嵌套詞典拼寫詞典列表

[英]How to flatten a list of dicts with nested dicts

我想整理一份字典,但有問題,

假設我有一個字典列表,

d = [{'val': 454,'c': {'name': 'ss'}, 'r': {'name1': 'ff'}},{'val': 'ss', 'c': {'name': 'ww'}, 'r': {'name1': 'ff'}}, {'val': 22,'c': {'name': 'dd'}, 'r': {'name1': 'aa'}}]

我想要得到的輸出是

d = [{'val': 454,'name': 'ss', 'name1': 'ff'},{'val': 'ss','name': 'ww', 'name1': 'ff'},{'val': 22, 'name': 'dd', 'name1': 'aa'}]

為此,我正在使用以下功能,

def flatten(structure, key="", flattened=None):
    if flattened is None:
        flattened = {}
    if type(structure) not in(dict, list):
        flattened[key] = structure
    elif isinstance(structure, list):
        for i, item in enumerate(structure):
            flatten(item, "%d" % i, flattened)
    else:
        for new_key, value in structure.items():
            flatten(value, new_key, flattened)
    return flattened

現在,我的問題是,它僅在字典中生成第一個元素

您可能在錯誤的地方初始化了某些東西。 看一下下面的代碼:

d = [{'val': 454, 'c': {'name': 'ss'}, 'r': {'name1': 'ff'}}, {'val': 55, 'c': {'name': 'ww'}, 'r': {'name1': 'ff'}}, {'val': 22, 'c': {'name': 'dd'}, 'r': {'name1': 'aa'}}]
#                                                                     ^ typo here

def flatten(my_dict):
    res = []
    for sub in my_dict:
        print(sub)
        dict_ = {}
        for k, v in sub.items():
            if isinstance(v, dict):
                for k_new, v_new in v.items():
                    dict_[k_new] = v_new
            else:
                dict_[k] = v
        res.append(dict_)
    return res

result = flatten(d)
print(result)  # [{'name': 'ss', 'name1': 'ff', 'val': 454}, {'name': 'ww', 'name1': 'ff', 'val': 55}, {'name': 'dd', 'name1': 'aa', 'val': 22}]

如果為None ,則應將flattened初始化為與structure相同的類型,並在list情況下遞歸時傳遞None

def flatten_2(structure, key="", flattened=None):
    if flattened is None:
        flattened = {} if isinstance(structure, dict) else []
    if type(structure) not in(dict, list):
        flattened[key] = structure
    elif isinstance(structure, list):
        for i, item in enumerate(structure):
            flattened.append(flatten(item, "%d" % i))
    else:
        for new_key, value in structure.items():
            flatten(value, new_key, flattened)
    return flattened

In [13]: flatten_2(d)
Out[13]: 
[{'name': 'ss', 'name1': 'ff', 'val': 454},
 {'name': 'ww', 'name1': 'ff', 'val': 'ss'},
 {'name': 'dd', 'name1': 'aa', 'val': 22}]

當然,這僅適用於有限類型的數據。

暫無
暫無

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

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