首页 > 解决方案 > 在 Python 中过滤嵌套字典

问题描述

我正在尝试过滤嵌套字典。我想创建一个新字典,其值与列表中的项目匹配。到目前为止,我已经能够将字典向下过滤一层, on ,但我找不到一种方法来过滤字典向下两层。

当'roll'的值不在时,我设法过滤掉键rollList,但我现在想在'item1','item2','item3'的值不在时过滤掉键item123List。这是我的代码:

# initializing dictionary
test_dict = {'Nikhil' : { 'roll' : 24, 'marks' : 17, 'extra' : {'item1': 5, 'item2': 3, 'item3': 2}},
             'Akshat' : {'roll' : 54, 'marks' : 12, 'extra' : {'item1': 8, 'item2': 4, 'item3': 3}}, 
             'Akash' : { 'roll' : 12, 'marks' : 15, 'extra' : {'item1': 9, 'item2': 3, 'item3': 1}}}

new_dict = {}

rollList = [24, 54]
item123List = [2, 4, 6, 8, 10]

new_dict = {k:v for k,v in test_dict.items() if v['roll'] in rollList}  # filter on roll: successfully

# How to filter on values in item1, item2, item3?
new_dict = {k:v for k,v in test_dict.items() if v['extra'] in item123List} # filer on items: unsuccessfully

所以我想要得到的是一个字典,其中不在 item123list 中的值被过滤掉了“额外”,当“额外”不包含任何值时,“主”键被过滤掉。看起来是这样的:

new_dict = {'Nikhil' : { 'roll' : 24, 'marks' : 17, 'extra' : {'item3': 2}},
             'Akshat' : {'roll' : 54, 'marks' : 12, 'extra' : {'item1': 8, 'item2': 4}}}

标签: pythondictionaryfilter

解决方案


您可以尝试嵌套字典理解:

test_dict = {'Nikhil' : { 'roll' : 24, 'marks' : 17, 'extra' : {'item1': 5, 'item2': 3, 'item3': 2}},
             'Akshat' : {'roll' : 54, 'marks' : 12, 'extra' : {'item1': 8, 'item2': 4, 'item3': 3}}, 
             'Akash' : { 'roll' : 12, 'marks' : 15, 'extra' : {'item1': 9, 'item2': 3, 'item3': 1}}}

new_dict = {}

rollList = [24, 54]
item123List = [2, 4, 6, 8, 10]

new_dict = {k:v for k,v in test_dict.items() if v['roll'] in rollList}
new_dict = {k: {i: {a: b for a, b in j.items() if b in item123List} if i == 'extra' else j \
                for i,j in v.items()} \
                for k, v in test_dict.items()}
print(new_dict)

输出:

{'Nikhil': {'roll': 24, 'marks': 17, 'extra': {'item3': 2}}, 'Akshat': {'roll': 54, 'marks': 12, 'extra': {'item1': 8, 'item2': 4}}, 'Akash': {'roll': 12, 'marks': 15, 'extra': {}}}

推荐阅读