需要使用相应的索引顺序比较两个列表的元素。使用map()和next()函数的组合:
# Последовательное сравнение элемента по совпадающими индексами двух списков. T.к. map() возвращает объект итератор, таковой необходимо пропустить через next()
g = map(lambda y: y,[1,2,4,3,4,5,6,4,4]) # то же самое можно записать как iter([1,2,4,3,4,5,6,4,4])
s = [i for i in map(lambda x: x == next(g), [1,2,4,3,4,5,6,4,5])]
print(s)
#Вывод: [True, True, True, True, True, True, True, True, False]
然而,当将map()函数本身而不是中间变量g替换到列表生成器中时,输出是截然相反的:
s = [i for i in map(lambda x: x == next(map(lambda y: y,[1,2,4,3,4,5,6,4,4])), [1,2,4,3,4,5,6,4,5])]
print(s)
#Вывод: [True, False, False, False, False, False, False, False, False]
为什么会发生这种情况?
在第一种情况下,顺序调用一个接一个地
next(g)检索g元素。也就是说,您逐个元素地比较两个列表。在第二种情况下,每个 lambda 调用都会创建一个新的生成器,每次都会从中检索第一个值。也就是说,将第二个列表的所有元素与第一个列表的第一个元素进行比较。
PS您是否对用表达式代替变量会改变程序的含义感到困惑?同意。但“替换规则”仅适用于没有副作用的计算。如果表达式的所有元素都是纯函数,则可以自由替换,程序的含义将保持不变。在您的情况下,调用
next(g)有一个副作用:它改变了生成器的状态g。这意味着“替代规则”在这里可能不起作用,而且确实不起作用。PPS Classic 解决您的问题: