如何在Python推导式中结合if语句实现变量递增?
解决Python推导式中统计满足条件元素的问题
嘿,我来帮你搞定这个推导式的问题~首先得理清你代码里的两个核心问题:
为什么当前代码返回一堆0?
你现在的列表推导式是每次满足条件时,就把count的当前值(一直是0)添加到新列表里,所以最后得到的是一个全是0的列表,而不是你想要的计数结果。而且你最后返回的是这个列表,不是count变量本身,这也偏离了你的目标。
为什么count +=1会报SyntaxError?
Python的列表推导式里,元素位置只能放表达式(能返回值的代码),而count +=1是个赋值语句,不属于表达式范畴,所以语法上不允许这么写。推导式的设计初衷是生成新序列,不是用来执行修改外部变量这种“副作用”操作的。
正确的解决方法
其实根本不需要手动维护count变量,我们可以直接统计满足条件的元素数量,这里有几种更简洁高效的方式:
方法1:用列表推导式生成符合条件的元素,再取长度
# 注意:不要用list当变量名,会覆盖Python内置的list类型 my_list = [1,2,4,5,7,8,10] d = 3 # 生成所有满足条件的x的列表,再取长度就是计数 count = len([x for x in my_list if (x + d in my_list) and (x + 2*d in my_list)]) return count
方法2:用生成器表达式+sum()(更节省内存)
如果你的列表很大,生成器表达式不需要创建完整的列表,直接逐个计算,性能更优:
my_list = [1,2,4,5,7,8,10] d = 3 # 满足条件时返回1,sum把所有1加起来就是总个数 count = sum(1 for x in my_list if (x + d in my_list) and (x + 2*d in my_list)) return count
优化:用集合加速in操作
列表的in操作是O(n)时间复杂度,把列表转成集合后,in操作变成O(1),大列表下速度会快很多:
my_list = [1,2,4,5,7,8,10] d = 3 my_set = set(my_list) count = sum(1 for x in my_list if (x + d in my_set) and (x + 2*d in my_set)) return count
内容的提问来源于stack exchange,提问作者sword1st
相关产品推荐
相关产品推荐

