如何用Pythonic方式实现不同类别元素的全组合遍历
实现任意数量类别元素的全组合(Pythonic方式)
Python标准库中的itertools.product()就是专门解决这类任意多组元素笛卡尔积(全组合)问题的工具,完全符合Pythonic风格,无需自己造轮子。
基础用法示例
- 两类元素的场景:
import itertools cat_1 = [1, 2] cat_2 = ['a', 'b'] # 直接传入多组可迭代对象,转换为列表即可得到结果 result = list(itertools.product(cat_1, cat_2)) print(result) # 输出:[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
- 三类元素的场景:
cat_3 = ['x', 'y'] result = list(itertools.product(cat_1, cat_2, cat_3)) print(result) # 输出:[(1, 'a', 'x'), (1, 'a', 'y'), (1, 'b', 'x'), (1, 'b', 'y'), (2, 'a', 'x'), (2, 'a', 'y'), (2, 'b', 'x'), (2, 'b', 'y')]
封装为通用函数
如果需要一个可复用的函数,接收任意数量的类别参数,只需用可变参数*categories传递给itertools.product():
import itertools def full_combinations(*categories): return list(itertools.product(*categories)) # 调用示例 print(full_combinations(cat_1, cat_2)) print(full_combinations(cat_1, cat_2, cat_3))
补充:手动实现思路(不推荐,仅作参考)
如果不想依赖标准库,可通过递归或functools.reduce实现,但效率和简洁性远不如itertools.product():
from functools import reduce def full_combinations_manual(*categories): def combine(a, b): return [(x + (y,)) for x in a for y in b] # 初始化第一个类别为单个元素的元组列表,再依次与后续类别组合 return reduce(combine, categories, [(x,) for x in categories[0]]) # 调用示例 print(full_combinations_manual(cat_1, cat_2))
内容的提问来源于stack exchange,提问作者link89
相关产品推荐
相关产品推荐

