Python多组嵌套列表按规则对比数值返回结果问题排查
数值对比规则实现问题
现有数据
我有5组数值数据,numpy数组格式如下:
[[83.91649562 79.51353257] [87.57474691 84.66544614] [84.08067077 85.19063777] [86.97440657 86.20994142] [82.91694642 84.65734125]]
判定规则
需要按以下规则逐组对比两个数值,只要任意一组满足对应规则就返回对应结果,全部不满足返回0:
- 组内两个值均>=80,且第一个值小于第二个值,返回-10
- 组内两个值均<=20,且第一个值大于第二个值,返回10
- 其余情况返回0
现有问题
我最初写的实现代码如下:
def myfunction(data): data = data.iloc[:, [0, 1]].values for x, y in enumerate(data): if (x-y).all() >= 80 and x < y: return -10 else: return 0
这段代码运行后始终返回0,但测试数据里第3组、第5组明显满足第一条规则,应该返回-10,而且我还没写完第二条规则的判断逻辑。
我也试过把数据转成嵌套列表格式,代码如下:
data = data.iloc[:, [0, 1]].values.tolist()
转换后的数据格式为:
[[83.91649561983937, 79.51353257164777], [87.57474691499445, 84.66544613660386], [84.08067077024245, 85.19063776835876], [86.97440656949847, 86.20994141824511], [82.91694641784167, 84.65734125252753]]
转换后还是得不到正确结果。之前用enumerate()只是因为这个写法不容易触发报错,不确定是否适合当前场景。
错误原因说明
原代码有3个核心问题:
enumerate()遍历的返回值第一个是行索引(从0开始的整数),第二个才是每行的数值数组,原代码把索引当成了第一个数值,把整行数组当成了第二个数值,变量取值完全错误- 判断逻辑写错:
(x-y).all() >= 80是对数组求差再判断所有元素非负,和“两个值都大于等于80”的需求完全不符 - 循环第一次迭代就会触发
return,根本不会遍历后续所有行,只要第一组不满足规则就直接返回0
修正后代码
def myfunction(data): # 取前两列转为嵌套列表,直接解包拿到每组的两个值 data = data.iloc[:, [0, 1]].values.tolist() for item1, item2 in data: # 判定第一条规则 if item1 >= 80 and item2 >= 80 and item1 < item2: return -10 # 判定第二条规则 if item1 <= 20 and item2 <= 20 and item1 > item2: return 10 # 所有组都不满足规则返回0 return 0
用提供的测试数据运行,函数会在遍历到第三组时触发第一条规则,正确返回-10。
内容的提问来源于stack exchange,提问作者hifriend
相关产品推荐
相关产品推荐

