如何用生成器替代for循环实现分箱nan均值计算及解决返回None问题
解决分箱nan均值计算的简洁写法与生成器实现
嘿,先给你揪出问题的根源:你用的那个列表推导式[beta.append(np.nanmean(i)) for i in shortlist]之所以返回全None,是因为list.append()本身就不返回任何有效结果(它的返回值是None)——这个推导式其实是把每次调用append的返回值攒成了列表,而不是你要的均值结果,完全是用错了列表推导式的用法~
下面给你几个符合需求的优化方案,包括你想要的生成器实现:
1. 最简洁的列表推导式写法
如果只是想得到最终的10个浮点数列表,根本不用先初始化空列表再逐个append,直接用列表推导式生成结果就行:
beta = [np.nanmean(sublist) for sublist in shortlist]
这行代码和你原来的循环beta=[]; for e in shortlist: beta.append(np.nanmean(e))效果完全一致,但简洁太多,而且直接得到你要的浮点数列表。
2. 内存友好的生成器表达式
如果你的数据量很大(比如分箱数远不止10个),不想一次性把所有结果都存在内存里,就用生成器表达式——它会延迟计算,只在你需要的时候才生成下一个均值:
beta_gen = (np.nanmean(sublist) for sublist in shortlist)
使用的时候,你可以直接迭代它:
# 逐个获取均值 for mean_val in beta_gen: print(mean_val) # 要是后续需要完整列表,再转成列表就行 beta_list = list(beta_gen)
生成器的好处就是省内存,尤其处理大数据的时候优势明显。
3. 自定义生成器函数(适合扩展逻辑)
如果之后你需要给计算加一些额外逻辑(比如跳过空的子列表、打印日志),可以写一个带yield的生成器函数,可读性更强:
def box_nanmean_generator(shortlist): for sublist in shortlist: # 这里可以加额外逻辑,比如跳过空列表 if not sublist: yield np.nan continue yield np.nanmean(sublist) # 使用方式 beta_gen = box_nanmean_generator(shortlist)
这种方式灵活性更高,后续改逻辑也方便。
总结一下:你之前的列表推导式是用错了方法,正确的写法直接生成结果就行;如果追求内存效率,生成器表达式或自定义生成器就是最优解,完全满足你想要的简洁+生成器的需求~
内容的提问来源于stack exchange,提问作者lmm_5000
相关产品推荐
相关产品推荐

