Python:如何在map函数执行过程中跳过指定元素
问题原理说明
map本身是1:1映射的函数,输入N个元素就一定会输出N个元素,本身不具备跳过元素的能力,你之前的两种写法错误原因如下:
- 第一种写法
list(map(lambda x: x, inp.remove('b'))):list.remove()是原地修改方法,返回值为None,相当于给map传入了空的可迭代对象,无法正常执行。 - 第二种写法
list(map(lambda x: x if x != 'b' else pass , inp)):pass在表达式中会被处理为None,最终得到的列表会出现None占位,而不是直接删掉对应元素。
正确实现方案
要实现跳过指定元素的效果,必须先调用filter过滤掉不需要的元素,再执行map操作,顺序为「先过滤、后映射」。
基础测试用例实现
对应你给出的输入示例,写法如下:
inp = ['a','b','c'] result = list(map(lambda x: x, filter(lambda x: x != 'b', inp))) print(result) # 输出 ['a', 'c']
复杂场景使用说明
你最终采用的写法是完全正确的,适合处理DataFrame Schema这类复杂嵌套结构:
fields = {c:list(map(lambda field: field.name, filter(lambda field: field.name != 'val', dfu.schema.fields[i].dataType.elementType.fields))) for i,c in enumerate(dfu.columns) if c in cols}
如果想要代码更简洁易读,也可以用列表推导式/生成器表达式代替map+filter的组合,效果完全一致:
# 基础用例推导式写法 result = [x for x in inp if x != 'b'] # 复杂场景推导式写法 fields = { c: [field.name for field in dfu.schema.fields[i].dataType.elementType.fields if field.name != 'val'] for i, c in enumerate(dfu.columns) if c in cols }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

