Python中filter与itertools.product联用输出异常问题排查
问题根因
这是典型的对filter()函数运行逻辑理解偏差导致的问题,核心是两个认知点出错:
filter(判定函数, 可迭代对象)的作用是筛选不是转换:它会遍历可迭代对象里的每一个原始元素,把元素传给判定函数,只要判定函数返回值的布尔值为真,就把这个原始元素原封不动保留下来。判定函数的返回值只用来判断元素要不要留,不会替换原始元素存入结果。itertools.product()产出的每个元素本身就是元组:比如repeat=1时产出的是('0',)、('1',),repeat=2时产出的是('0', '0')、('0', '1')这类元组,本身不是字符串。
你第二段代码里写的lambda elm: ''.join(elm),只是拿元组拼接后的字符串当筛选判断的条件——而你生成的所有元组拼出来的都是非空字符串,布尔值全为True,等于这个filter根本没筛掉任何元素,直接把product生成的所有原始元组原封不动塞进了列表,压根没把“元组转拼接字符串”的结果存进去,当然输出的全是元组。
反观第一段能正常运行的代码,逻辑是遍历到每个元组elm后,显式执行''.join(elm)把元组转成字符串,再把转换完成的字符串存到列表里,自然能得到预期的字符串列表。
修正方案
如果想写这种函数式的简洁写法,这里应该用做元素转换的map(),而不是做筛选的filter(),修改后的代码如下:
from itertools import product data = [] for _ in range(1, 3): data += map(lambda elm: ''.join(elm), product('01', repeat=_)) print(data)
运行输出和第一段代码完全一致:
['0', '1', '00', '01', '10', '11']
内容的提问来源于stack exchange,提问作者Evil Giraffe
相关产品推荐
相关产品推荐

