如何基于含有限重复元素的列表生成指定长度的合法组合?
Python 三元组提取解决方案
你对itertools.combinations的功能存在误解,这个函数本身就可以满足你的需求。itertools.combinations是基于元素位置索引生成不重复组合,仅限制选中的位置不重复,不会对元素的值做去重限制,完全适配你列表中存在重复值、但不能超出现有重复值数量的要求。
实现代码
import itertools my_list = [-1, 0, 2, 0] # 生成所有三元组组合,返回元组格式 triples = itertools.combinations(my_list, 3) # 转为嵌套列表格式 result = [list(item) for item in triples] print(result)
输出结果
[[-1, 0, 2], [-1, 0, 0], [-1, 2, 0], [0, 2, 0]]
完全匹配你的预期输出,也不会出现[0,0,0]这类无效结果:因为原列表只有2个值为0的元素,最多只能同时选中2个0的位置,不可能生成包含3个0的三元组。
可选:按值去重
如果你需要把值相同、顺序不同的三元组视为同一个(比如认为[-1,0,2]和[-1,2,0]是同一种组合),可以增加去重逻辑:
unique_result = [list(item) for item in {tuple(sorted(t)) for t in itertools.combinations(my_list, 3)}] print(unique_result) # 输出:[[-1, 0, 0], [-1, 0, 2]]
内容的提问来源于stack exchange,提问作者drifter
相关产品推荐
相关产品推荐

