迭代嵌套字典以使用任何键获得相同的特定值

时间:2018-07-31 00:38:22

标签: python dictionary

我有一个QTreeView,它以以下格式填充,并且允许用户选择:

|--- allCars
|---|--- carA
|---|---|--- fiat
|---|--- carB
|---|---|--- fiat

我有一个嵌套的字典,如下所示:

car_dict = {
    '|carA': {
        '|carA|fiat': {
            '|carA|fiat|info': {
                'behaviour': {
                    'model': 'Panda',
                    'manufactured_date': '',
                    'vendors': {
                        'company': {
                            'usa': 'abc_company'
                            }
                        }
                },
                'projected': 200
            }
        }
    },
    '|carB': {
        '|carB|fiat': {
            '|carB|fiat|info': {
                'behaviour': {
                    'model': 'Punto',
                    'manufactured_date': '',
                    'vendors': {
                        'company': {
                            'usa': 'abc_company',
                            'russia': 'cde_company'
                            }
                        }
                },
                'projected': 450
            }
        }
    }
}

我正在尝试从此嵌套字典中导出company值。代码如下:

def derive_dict_recursively(search_dict, field):
    fields_found = []
    for key, value in search_dict.iteritems():
        if key == field:
            fields_found.append(value)

        elif isinstance(value, dict):
            results = derive_dict_recursively(value, field)
            for result in results:
                fields_found.append(result)

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = derive_dict_recursively(item, field)
                    for another_result in more_results:
                        fields_found.append(another_result)
    return fields_found


my_sel1 = "|carA"
filtered_dict1 = {k:v for k,v in car_dict.iteritems() if my_sel1 in k}
output1 = derive_dict_recursively(filtered_dict1, "company")
# Returns : [{'usa': 'abc_company'}]

my_sel2 = "|carA|fiat"
filtered_dict2 = {k:v for k,v in car_dict.iteritems() if my_sel2 in k}
output1 = derive_dict_recursively(filtered_dict2, "company")
# Returns : []

但是,如果用户选择|carA|fiat

,上述代码将起作用

如果我尝试仅选择|carA|fiat|carA|fiat|info进行迭代,它将返回一个空列表。 不管我选择的层次结构的“级别”如何,我都可以迭代字典并仍然获取company值的最佳方法是什么?

0 个答案:

没有答案