Python中匹配过滤两个字典提取对应子字典value值的实现方法
问题原因分析
- 原有代码未对
StrategyNumber做匹配校验,只要file2当前指标下存在符合日期非空的策略,就会遍历输出该指标下file1所有策略的value,是导致重复输出的核心原因 - 你给出的预期输出中第二个值
24应为笔误,对照你提供的file1结构,StrategyNumber=3对应的value为22,修正后符合数据逻辑的输出应为3000、22、234
修正方案
方案1:提前做策略映射(效率更高,推荐)
先把file1同指标下的策略按StrategyNumber做映射,避免嵌套循环匹配,代码如下:
for indicator in file2: # 构造当前指标下 StrategyNumber到value的映射字典 strat_value_map = {item['StrategyNumber']: item['value'] for item in file1[indicator]} for strat_info in file2[indicator]: # 先判断两个日期字段是否均非空 if len(strat_info["Openningdate"]) > 0 and len(strat_info["Closingdate"]) > 0: # 直接取出对应策略号的value输出 print(strat_value_map[strat_info['StrategyNumber']])
方案2:在原有代码基础上增加匹配逻辑
如果不想修改原有循环结构,仅需补充StrategyNumber的匹配判断即可,代码如下:
for Strats in file2: for Strats_info in file2[Strats]: # 先判断日期是否符合条件,不符合直接跳过后续循环 if len(Strats_info["Openningdate"]) > 0 and len(Strats_info["Closingdate"]) > 0: for momentum_filter in file1[Strats]: # 增加同策略号匹配逻辑 if momentum_filter['StrategyNumber'] == Strats_info['StrategyNumber']: print(momentum_filter['value'])
运行输出
两种方案运行后均会得到如下结果:
3000 22 234
如果你预期输出中的24对应其他业务逻辑,可自行调整value取值部分的代码即可。
内容的提问来源于stack exchange,提问作者georgehere
相关产品推荐
相关产品推荐

