如何用Lambda表达式改写带if判断的列表遍历代码?
问题分析与解决
你的原代码通过遍历val,将对应值大于29的ids元素收集起来,输出[2,4,5,7]。你尝试用filter+lambda实现时出现语法错误,问题出在两个地方:
- lambda的参数定义不合法:不能写成
lambda ids[i],参数必须是一个有效的变量名 - 传入
range(len(val))得到的是索引,即使语法正确,最终得到的也是符合条件的索引,而非ids的元素值
正确实现方式
方式1:filter + lambda 结合 zip
把ids和val配对成元组,用lambda判断元组中val的元素是否大于29,最后提取ids的元素:
ids = [1,2,3,4,5,6,7] val = [20,30,26,38,40,22,35] # 先过滤出val元素>29的(ids, val)元组 filtered_pairs = filter(lambda pair: pair[1] > 29, zip(ids, val)) # 提取元组中的ids元素 new_id = [pair[0] for pair in filtered_pairs] print("ids", new_id)
方式2:更简洁的列表推导式(隐含lambda逻辑)
如果追求简洁,列表推导式可以直接实现需求,逻辑和原for循环完全一致:
ids = [1,2,3,4,5,6,7] val = [20,30,26,38,40,22,35] new_id = [id_num for id_num, val_num in zip(ids, val) if val_num > 29] print("ids", new_id)
两种方式的输出结果都是ids [2, 4, 5, 7],和原代码一致。
内容的提问来源于stack exchange,提问作者Glenn_ford7
相关产品推荐
相关产品推荐

