Python不使用itertools获取列表元素所有长度任意组合的实现方法
非连续全组合生成方案
你现有代码的问题是生成的是列表的连续子序列,无法覆盖[1,3]这类非连续元素的组合。这里给出位运算实现方案,无需引入第三方库:
def get_combination(list_of_palindrome): n = len(list_of_palindrome) res = [] # 遍历所有非空选择状态,1 << n 等价于 2**n for mask in range(1, 1 << n): current = [] for idx in range(n): # 检查当前位是否被选中 if mask & (1 << idx): current.append(list_of_palindrome[idx]) res.append(current) return res
实现逻辑说明:
- 长度为n的列表,每个元素有「选/不选」两种状态,刚好可以用长度为n的二进制数(掩码)表示所有选择可能
- 遍历范围从1到2^n -1,跳过掩码为0对应的空集,刚好覆盖所有非空组合场景
- 每个掩码对应一个组合:掩码第idx位为1时,就把列表第idx个元素加入当前组合
调用get_combination([1,2,3])即可得到你需要的所有非空组合,不需要字典序的话可直接使用,有排序需求可以对返回结果再做排序处理。
内容的提问来源于stack exchange,提问作者Tamada
相关产品推荐
相关产品推荐

