如何实现两个嵌套列表的全组合合并生成目标输出列表?
优化嵌套列表的集合合并实现
嗨,这个需求很典型,咱们来聊聊怎么把代码写得更优雅高效~
首先先明确下需求:我们要生成的目标列表O,其实是A中每一个子列表与B中每一个子列表的集合合并结果的全集,对吧?比如O的第一个元素是set(A[0]) | set(B[0]),第二个是set(A[0]) | set(B[1]),以此类推覆盖所有组合。
你当前用双重循环的方式是完全可行的,但确实有更简洁、可读性更强的实现方式,下面给你两种常用的优化方案:
1. 嵌套列表推导式
Python的列表推导式本身就是为这种“遍历+生成”场景设计的,比显式的for循环+append写法更紧凑,底层执行效率也和原生循环相当(甚至略优):
# 先定义示例的A和B A = [['A01', 'A02'], ['A11', 'A12'], ['A21', 'A22']] B = [['B01', 'B02'], ['B11', 'B12'], ['B21', 'B22']] # 用列表推导式生成O O = [set(a_sub) | set(b_sub) for a_sub in A for b_sub in B]
这种写法一行就能完成逻辑,完全等价于双重循环,但代码更简洁,可读性也更好。
2. 使用itertools.product生成笛卡尔积
如果你的需求后续可能扩展到更多列表的组合(比如同时处理A、B、C三个列表),用itertools.product会更灵活——它可以直接生成多个可迭代对象的笛卡尔积,避免手动写多层嵌套循环:
from itertools import product A = [['A01', 'A02'], ['A11', 'A12'], ['A21', 'A22']] B = [['B01', 'B02'], ['B11', 'B12'], ['B21', 'B22']] # product(A,B)会生成所有(a_sub, b_sub)的元组对 O = [set(a) | set(b) for a, b in product(A, B)]
这种写法的逻辑更清晰:明确表达了我们要处理A和B的所有元素组合,扩展性更强。
关于性能的补充
不管用哪种方式,时间复杂度都是O(M*N)(M是A的子列表数量,N是B的子列表数量),因为本质上都需要遍历所有子列表对。不过这两种优化写法在代码简洁度和可读性上都比手动双重循环要好很多。
另外,如果你的A、B子列表本身已经是set类型,那可以省去set()转换的步骤,直接写a | b,能进一步节省一点时间。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

