如何用单行代码按函数规则过滤Python嵌套字典的二级键
嵌套字典过滤逻辑的单行代码实现
问题背景
我有如下格式的Python嵌套字典:
example ={'2020_01': {'PM0001': 1088, 'CA00006': 33, 'X00002': 125, 'J00009': 119, 'A0000S': 524}, '2020_02': {'F00067': 3, 'P00001': 1104, 'X00002': 98, 'J0009': 36, 'A0000S': 539}, '2020_03': {'P00001': 1200, 'Z78800': 45,'X00000': 84,'NK0000': 4,'A0000S': 577,'V000000':11}}
需要提取一个新字典,仅保留二级嵌套字典中键符合指定规则的键值对,规则由以下自定义函数定义:
def rule(string): # 这是示例规则,实际逻辑会复杂得多 if string.startswith("P") or string.startswith("X"): if string[1] == "0": return True return False
目前已通过循环实现需求:
new_dict={} for date,ussage in example.items(): new_sub_dict = {key:value for key,value in ussage.items() if rule(key)==True} new_dict[date] = new_sub_dict new_dict
希望将上述循环改写为单行代码。
解决方案
可以使用嵌套字典推导式实现单行代码,逻辑和原循环完全一致:
new_dict = {date: {k: v for k, v in usage.items() if rule(k)} for date, usage in example.items()}
细节说明
- 外层推导式遍历原字典的每个日期键与对应二级字典
- 内层推导式对二级字典的键值对过滤,只保留满足
rule(k)的条目 rule(key)==True可简化为rule(key),因为函数本身返回布尔值
执行后得到的结果为:
{'2020_01': {'X00002': 125}, '2020_02': {'P00001': 1104, 'X00002': 98}, '2020_03': {'P00001': 1200, 'X00000': 84}}
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

