python - 在 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}}}
解决方案
您可以尝试嵌套字典理解:
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': {}}}
推荐阅读
- java - 使用广播接收器在重启时显示通知
- javascript - 试图让我的文本颜色永远交替闪烁,但不使用无限循环,有没有更好的方法?
- php - 每个 HTML 表格行的 PHP 交替颜色
- angular - “void”类型上不存在离子属性“订阅”
- airflow - 如何在 celery 任务中使用 ray?
- apache-spark - 在 pyspark 中执行 NLTK
- android - How do I get old activity window
- python - discord.py bot 和 webhook 框消息
- python - 如果在该实例中写入 csv 文件,如何不读取它?
- azure - Azure 帮助:你的登录被阻止