使用列表推导式实现占比计算函数报错:int对象不可迭代
问题分析与解决
首先,你的代码报错'int'对象不可迭代,根源出在sum(i)这部分——i是你遍历list_1时拿到的单个整数,而sum()函数要求传入一个可迭代对象(比如列表、元组),直接传单个整数自然会报错。
另外,你的逻辑也偏离了需求:你需要的是「正数/负数/零的数量占总数量的浮点占比」,但你现在用了取模运算%,这完全不是计算占比的正确方式。
修正后的实现
我们可以用列表推导式高效统计各类数值的数量,再除以总数得到占比,代码如下:
def plusMinus(*args): total = len(args) # 统计正数、负数、零的数量 pos_count = len([num for num in args if num > 0]) neg_count = len([num for num in args if num < 0]) zero_count = len([num for num in args if num == 0]) # 计算浮点占比,注意处理总数为0的情况(避免除以0) pos_ratio = pos_count / total if total != 0 else 0.0 neg_ratio = neg_count / total if total != 0 else 0.0 zero_ratio = zero_count / total if total != 0 else 0.0 print(f"正数占比: {pos_ratio}") print(f"负数占比: {neg_ratio}") print(f"零的占比: {zero_ratio}") plusMinus(10, 25, 30, 0, -45, -50)
代码说明
- 直接用
len(args)获取总数量,不需要额外循环计数,更简洁; - 用列表推导式筛选出对应数值后取长度,快速统计各类数量;
- 加入了
total != 0的判断,避免传入空参数时出现除以0的错误; - 用格式化字符串清晰输出各类占比,符合浮点分数的要求。
运行这段代码后,输出结果为:
正数占比: 0.5 负数占比: 0.3333333333333333 零的占比: 0.16666666666666666
如果你想进一步优化,还可以用生成器表达式代替列表推导式(把[]换成()),这样不会生成临时列表,内存效率更高:
pos_count = sum(1 for num in args if num > 0)
这里sum(1 for ...)会对每个符合条件的元素累加1,效果和len([...])一样,但更节省内存。
内容的提问来源于stack exchange,提问作者JD2775
相关产品推荐
相关产品推荐

