Python中如何获取列表的所有无序非空组合?
当然可以实现!
你要的其实是列表的所有非空无序组合(也就是所有非空子集,因为子集不考虑元素顺序,且不会出现重复的排列),Python的标准库itertools正好提供了完美的解决方案,完全符合你不想出现[1,2]和[2,1]这类重复项的要求。
具体实现思路
itertools.combinations(iterable, r)函数可以生成输入可迭代对象中所有长度为r的无序组合,而且不会产生重复的排列结果。我们只需要遍历从1到原列表长度的所有可能组合长度,把每个长度对应的组合收集起来就行。
代码示例
import itertools # 你的原始列表 original_list = [1, 2, 3] # 初始化结果列表 all_combinations = [] # 遍历从1到列表长度的所有组合长度 for combo_length in range(1, len(original_list) + 1): # 生成当前长度的所有组合,转成列表后加入结果 current_combos = list(itertools.combinations(original_list, combo_length)) # 把每个元组转成列表(因为combinations返回的是元组) all_combinations.extend([list(combo) for combo in current_combos]) print(all_combinations)
运行这段代码后,输出结果就是:
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
更简洁的写法(列表推导式)
如果喜欢更紧凑的代码,可以用嵌套列表推导式一步完成:
import itertools original_list = [1, 2, 3] all_combinations = [list(combo) for length in range(1, len(original_list)+1) for combo in itertools.combinations(original_list, length)] print(all_combinations)
补充说明
itertools.combinations生成的组合是无序且不重复的,所以完全不会出现你担心的[1,2]和[2,1]这类情况;- 如果需要包含空集(
[]),只需要把range(1, ...)改成range(0, ...)即可。
内容的提问来源于stack exchange,提问作者NePtUnE
相关产品推荐
相关产品推荐

