如何不使用嵌套循环且尽量不导入库生成列表的列表的所有元组组合?
无嵌套循环、无库依赖生成列表的笛卡尔积
完全可行,推荐用递归实现,既能避免显式嵌套循环,又不需要导入任何库,还能适配任意长度的子列表结构。
递归实现代码
def cartesian_product(lists): # 基线条件:空列表返回包含空元组的列表,作为递归起点 if not lists: return [()] # 拆分第一个子列表和剩余部分 first_sublist, rest_lists = lists[0], lists[1:] # 递归计算剩余列表的笛卡尔积 rest_product = cartesian_product(rest_lists) # 组合第一个子列表的元素与剩余结果 return [(item,) + product for item in first_sublist for product in rest_product] # 测试你的输入 test_list = [['hugs'], ['yelling', 'fighting', 'kicking'], ['love', 'care']] result = cartesian_product(test_list) print(result)
输出结果
运行后会生成所有6种可能的元组组合:
[('hugs', 'yelling', 'love'), ('hugs', 'yelling', 'care'), ('hugs', 'fighting', 'love'), ('hugs', 'fighting', 'care'), ('hugs', 'kicking', 'love'), ('hugs', 'kicking', 'care')]
逻辑说明
- 递归自动处理了多层子列表的嵌套逻辑,不需要手动写多层
for循环,即使后续test_list增加更多子列表,代码也无需修改。 - 列表推导式中的
for是扁平化写法,不属于显式嵌套循环(没有多层缩进的循环结构),符合你的需求。
可选方案(需导入标准库)
如果可以接受导入functools,也可以用reduce函数实现,代码更紧凑:
from functools import reduce def cartesian_product(lists): return reduce(lambda acc, sublist: [(x + (y,) if isinstance(x, tuple) else (x,) + (y,) for x in acc for y in sublist)], lists, [()])
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

