Python any()函数处理负数列表时不符合预期的问题求助
嘿,看你在Spyder用Python 3.6的any()处理数字列表时遇到了坑——一会儿符合预期,一会儿又不对,尤其是列表里有负数时if直接返回True,还有提到的数字1转换的问题。我来帮你捋清楚:
先搞懂any()到底怎么工作的
any()的逻辑其实很简单:遍历你给的可迭代对象,只要里面有一个元素被Python判定为“真”,就返回True;只有所有元素都是“假”的时候才返回False。
而对于数字来说,Python的规则是:
- 0(不管整数还是浮点数)是“假”
- 其他所有数字,不管正还是负,全是“真”
这就是为啥你列表里只要有负数,any()就返回True——因为负数是非零数,被当成了布尔值True,不止负数,正数也会这样,除非你列表全是0。
你的代码大概率是这里出问题了
你说列表是用list(map(my_func, other_lst))生成的,那首先得确认my_func返回的是不是你想要的布尔判断结果,而不是原始数字。
举个例子,如果你想判断列表里有没有小于0的数,正确的写法应该是这样:
lst = list(map(my_func, other_lst)) # 重点:把每个数字转换成「是否小于0」的布尔值 if any(num < 0 for num in lst): print("列表里有负数哦")
但如果你直接写if any(lst),那只要列表里有非零数字(不管正负)都会返回True,这就会出现你说的“负数让if返回True”的情况——其实这不是bug,是你没给any()传对判断条件。
关于你提到的“将1转换为……”的排查
你后面没写完这个部分,但估计也是my_func的返回值问题。比如如果my_func把1转换成了某个非零值,那any()照样会把它当成True。建议你先把生成的列表打出来看看:
lst = list(map(my_func, other_lst)) print("生成的列表内容:", lst)
一看具体元素的类型和值,就能明白any()为啥会那样判断了。
给你几个测试例子参考
# 例子1:列表里有负数 lst1 = [1, -2, 3] print(any(lst1)) # 输出True,因为-2是非零值 print(any(num < 0 for num in lst1)) # 输出True,这才是你要的“判断是否有负数” # 例子2:列表全是正数 lst2 = [1, 2, 3] print(any(lst2)) # 输出True print(any(num < 0 for num in lst2)) # 输出False,正确判断没有负数 # 例子3:列表全是0 lst3 = [0, 0, 0] print(any(lst3)) # 输出False
最后总结一下
核心问题就是你直接把数字列表丢给any()了,而没有把每个元素转换成你需要的判断条件。改成any(你的判断条件 for 元素 in 列表)这种生成器表达式的形式,就能得到你预期的结果啦。
内容的提问来源于stack exchange,提问作者jacob

