如何使map返回列表匹配的全量布尔值(含缺失元素判定)
解决方法:让不等长列表的元素全量进行布尔判定
问题出在map()函数会在任意一个输入迭代器耗尽时停止执行,所以当a比b长时,多出来的'c'根本没机会进入eq比较。要实现全量元素的判定,我们需要先让两个列表的长度对齐,再进行比较,这里有两种实用的方案:
方案1:用itertools.zip_longest对齐列表(推荐)
zip_longest可以把短的列表用指定值填充到和长列表一样长,默认填充None。因为原列表里的元素是字符串,和None比较自然会返回False,完美符合需求:
from operator import eq from itertools import zip_longest a = ['a','b', 'c'] b = ['a', 'b'] # 直接用zip_longest对齐后比较,多余元素会和None对比得到False result = [x == y for x, y in zip_longest(a, b)] # 或者继续用map,结合lambda处理 result = list(map(lambda x, y: eq(x, y), *zip_longest(a, b)))
运行后结果就是[True, True, False]。
方案2:手动填充短列表(不用额外库)
如果不想引入itertools,可以手动计算两个列表的最大长度,把短的列表补全到对应长度,再用map(eq)处理:
from operator import eq a = ['a','b', 'c'] b = ['a', 'b'] max_length = max(len(a), len(b)) # 给短列表填充None,长度对齐 a_padded = a + [None] * (max_length - len(a)) b_padded = b + [None] * (max_length - len(b)) result = list(map(eq, a_padded, b_padded))
这个方法的逻辑和方案1一致,只是手动实现了填充步骤,结果同样符合预期。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

