如何用lambda函数实现含嵌套循环与条件的列表推导式等效逻辑?
用Lambda函数实现嵌套列表推导式的功能
问题背景
你有如下嵌套列表推导式,它能生成两个列表元素的笛卡尔积并过滤掉x等于y的元组:
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
同时你也了解到简单列表推导式可以用map+lambda替代,比如:
squares = list(map(lambda x: x**2, range(10))) # 等价于 squares = [x**2 for x in range(10)]
想知道如何用lambda函数实现第一个嵌套列表推导式的功能?
实现方法
方法一:结合itertools.product与filter
最简洁的方式是用itertools.product生成两个列表的笛卡尔积(对应推导式里的嵌套循环),再用filter配合lambda过滤符合条件的元素:
from itertools import product result = list(filter(lambda pair: pair[0] != pair[1], product([1,2,3], [3,1,4]))) print(result) # 输出: [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
方法二:纯嵌套map(无需额外库)
如果不想引入itertools,可以用嵌套map生成所有元组,再扁平化后过滤,但可读性较差:
result = list(filter( lambda pair: pair[0] != pair[1], (pair for sublist in map(lambda x: [(x, y) for y in [3,1,4]], [1,2,3]) for pair in sublist) )) print(result) # 输出与上面一致
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

