Python嵌套循环中变量替换失效问题及解决方案咨询
问题分析与解决方法
你的问题出在阈值变量没有在每次需要的时候重置为默认值。
原来的代码里,lower_threshold和upper_threshold是在所有循环外面定义的全局变量。第一次外层循环(i=0)处理到k2-01-003|15时,这两个变量被替换成了字典里的数值;但到了i=1和i=2的外层循环时,你没有把它们重新设回默认的6.33和1e+30,所以后面处理其他不在字典里的patient_visit时,变量依然保持着上次修改后的数值,自然输出就不符合预期了。
几种可行的解决方法:
方法1:每次外层循环开始时重置默认阈值
把默认阈值的赋值放到外层循环里面,确保每一轮外层循环都从初始默认值开始:
default_lower = 6.33 default_upper = 1e+30 threshold_dict_by_patient_and_visit = { "k2-01-003|15" : [15.007, 1e+30] } mylist = ['k2-01-003|18', 'k2-01-003|13','k2-01-003|15'] for i in range(3): # 每轮外层循环都重置为默认值 lower_threshold = default_lower upper_threshold = default_upper for patient_visit in mylist: if patient_visit in threshold_dict_by_patient_and_visit: lower_threshold, upper_threshold = threshold_dict_by_patient_and_visit[patient_visit] print(i, patient_visit, lower_threshold, upper_threshold)
方法2:内层循环每次先设默认值再判断
这种方式更稳妥,完全不依赖外层的状态,每次处理单个patient_visit时都先从默认值开始:
default_lower = 6.33 default_upper = 1e+30 threshold_dict_by_patient_and_visit = { "k2-01-003|15" : [15.007, 1e+30] } mylist = ['k2-01-003|18', 'k2-01-003|13','k2-01-003|15'] for i in range(3): for patient_visit in mylist: # 先赋值默认值,再检查是否有自定义阈值 lower_threshold, upper_threshold = default_lower, default_upper if patient_visit in threshold_dict_by_patient_and_visit: lower_threshold, upper_threshold = threshold_dict_by_patient_and_visit[patient_visit] print(i, patient_visit, lower_threshold, upper_threshold)
方法3:用字典的get方法简化代码
这是最Pythonic的方式,利用字典get方法的默认值特性,一行搞定阈值赋值:
default_threshold = (6.33, 1e+30) threshold_dict_by_patient_and_visit = { "k2-01-003|15" : (15.007, 1e+30) } mylist = ['k2-01-003|18', 'k2-01-003|13','k2-01-003|15'] for i in range(3): for patient_visit in mylist: # get方法如果找不到key,就返回默认的阈值元组 lower_threshold, upper_threshold = threshold_dict_by_patient_and_visit.get(patient_visit, default_threshold) print(i, patient_visit, lower_threshold, upper_threshold)
这三种方法都能得到你预期的输出结果,其中方法3代码最简洁,推荐使用。
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

