扁平化包含列表的Python字典

问题描述 投票:0回答:1

我正在尝试标准化包含一些列表的字典。作为 MVCE(最小、可验证、完整示例),请考虑以下字典:

test_dict = {
    'name' : 'john',
    'age' : 20,
    'addresses' : [
        {
            'street': 'XXX',
            'number': 123,
            'complement' : [
                'HOUSE',
                'NEAR MARKET'
            ]
        },
        {
            'street': 'YYY',
            'number': 456,
            'complement' : [
                'AP',
                'NEAR PARK'
            ]
        },
    ],
    'phones' : [
        '123456'
    ],
    'gender' : 'MASC'
}

我希望在字典中找到的每个列表都生成一行,所以我想要的输出是:

{'name': 'john', 'age': 20, 'street': 'XXX', 'number': 123, 'complement': 'HOUSE', 'phones': '123456', 'gender' : 'MASC'}
{'name': 'john', 'age': 20, 'street': 'XXX', 'number': 123, 'complement': 'NEAR MARKET', 'phones': '123456', 'gender' : 'MASC'}
{'name': 'john', 'age': 20, 'street': 'YYY', 'number': 456, 'complement': 'AP', 'phones': '123456', 'gender' : 'MASC'}
{'name': 'john', 'age': 20, 'street': 'YYY', 'number': 456, 'complement': 'NEAR PARK', 'phones': '123456', 'gender' : 'MASC'}

但是,当我运行代码时,我无法迭代多个列表。我的目的是开发一个递归函数,这样我就不必担心结构更复杂的字典(字典内有更多列表的字典等)。但是,当我运行代码时,我得到的输出是:

{'name': 'john', 'age': 20, 'street': 'XXX', 'number': 123, 'complement': 'HOUSE'}
{'name': 'john', 'age': 20, 'street': 'XXX', 'number': 123, 'complement': 'NEAR MARKET'}
{'name': 'john', 'age': 20, 'street': 'YYY', 'number': 456, 'complement': 'AP'}
{'name': 'john', 'age': 20, 'street': 'YYY', 'number': 456, 'complement': 'NEAR PARK'}
{'name': 'john', 'age': 20, 'phones': '123456'}

我的Python代码(MVCE):

def get_list_values(lista, dicionario, key_name, results):
    if len(lista) > 0:
        for l in lista:
            if isinstance(l, dict):
                search_values(l, dicionario.copy(), results)
            else:
                dicionario_metodo = dicionario.copy()
                dicionario_metodo[key_name] = l
                results.append(dicionario_metodo)

def search_values(dicionario, test, results):
    for k, v in dicionario.items():
        if isinstance(v, list):
            get_list_values(v, test, k, results )
        else: 
            test[k] = v
    if not any(isinstance(v, list) for v in dicionario.values()):
        results.append(test.copy())
    return results 


test = {}
results = []
for r in search_values(test_dict, test, results):
    print(r)

我的递归的哪一部分出了问题,所以它没有生成我想要的输出?

python
1个回答
0
投票

我的递归的哪一部分出了问题,所以它没有生成我想要的输出?

有人可能会说,在知道所有键之前附加结果而没有修复此结果,这是错误的。但是,我看不到在不对给定代码进行实质性更改的情况下纠正此问题的方法。

def get_list_values(lista, key_name):
    results = []
    for l in lista:
        if isinstance(l, dict):
            results += search_values(l)
        else:
            results += [{key_name: l}]
    return results

def search_values(dicionario):
    results = [{}]
    for k, v in dicionario.items():
      results_metodo = []
      for r in results: # multiply current results by new values
        if isinstance(v, list):
            for d in get_list_values(v, k): results_metodo += [dict(r, **d)]
        else:
            results_metodo += [dict(r, **{k: v})]
      results = results_metodo
    return results 

for r in search_values(test_dict): print(r)
© www.soinside.com 2019 - 2024. All rights reserved.