Python如何简洁生成单值列表所有不重复排列(真值表场景)
需求说明
需要基于Python实现真值表场景下的取值列表生成功能:
- 给定固定取值集合(例如布尔场景下的
[0, 1]),当输入个数为指定值n时,生成长度为n的所有取值组合元组列表 - 例如取值集合为
[0,1]、输入个数为2时,需要输出[(0, 0), (0, 1), (1, 0), (1, 1)] - 功能需满足两个要求:
- 覆盖所有符合规则的取值组合
- 返回列表中不存在重复项
现有冗余实现
目前的实现逻辑绕路,代码如下:
from itertools import permutations number_of_inputs = 3 set_of_values = [0, 1] list_of_permutations = list(dict.fromkeys(list(permutations(set_of_values * number_of_inputs, number_of_inputs))))
该方案先把取值集合复制n倍,再做全排列,最后通过字典去重,存在不必要的性能开销,需要找更简洁的实现,最好能通过单行函数调用直接完成需求。
优化方案
直接使用标准库itertools中的product函数即可,该函数原生用于计算可重复的笛卡尔积,完全匹配真值表组合的生成场景,天然无重复、全覆盖,不需要额外的去重操作,性能远高于原方案。
实现代码:
from itertools import product number_of_inputs = 3 set_of_values = [0, 1] list_of_combinations = list(product(set_of_values, repeat=number_of_inputs))
代码说明:
- 传入
repeat=number_of_inputs参数,即可指定生成元组的长度为输入个数 - 当输入个数为2、取值集合为
[0,1]时,返回结果正好是[(0, 0), (0, 1), (1, 0), (1, 1)],完全符合预期 - 不需要做额外的去重、类型转换操作,单行核心调用即可完成需求
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

