【发布时间】:2013-10-03 21:37:34
【问题描述】:
我正在尝试从列表中查找子集的所有组合,其中每个元素仅使用一次。
为了澄清我的意思,给出一个示例列表:
[1, 2, 3, 4]
我可以生成,以下组合:
[(1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3)] (这应该是详尽无遗的!)
然后我可以生成这些组合的组合:
[[(1), (2), (3)], [(1, 2), (3)], [(1, 3), (2)], [(1), (2, 3)],[(1, 2, 3)],...(对于许多)]
重点是我只能在给定的组合中使用每个元素一次。所以我不能:
[(1), (1, 2, 3)] 因为元素 1 被使用了两次。
我一直在尝试对小 n (n
我不确定我是否很好地提出了我的问题,所以请提出澄清问题。另外,如果有某些关键词可以帮助我澄清问题,请告诉!我对 Python 方法很感兴趣——但我愿意接受任何数学方法来帮助我做到这一点。运行时是我希望稍后解决的问题!
谢谢!
编辑 1:查看此问题的另一种方法是子集和问题,但警告 1:不仅要找到所有可能的子集,还要找到子集的所有组合,使得原始列表的元素数量最多使用,其中每个单独的子集总和为 0(或 k)。
然后我的目标是遍历所有答案并根据最终未使用的元素数量对它们进行评分,并选择一组“最佳”子集。'
编辑 2:接受答案,但修改为接受用户创建的列表 myList = ['a', 'b', 'c', 'd']
def partitions(myList):
if not myList:
yield []
else:
for partial_partition in partitions(myList[:-1]):
for i in range(len(partial_partition)):
copy_partition = partial_partition[:]
copy_partition[i] += (myList[-1],)
yield copy_partition
yield partial_partition + [(myList[-1],)]
【问题讨论】:
-
在我看来,您只想要初始集的所有可能分区。有可能不包括某些项目。
-
“我的目标是遍历所有答案,并根据最终未使用的元素数量对它们进行评分,然后选择一组“最佳”子集。” - 那么我不确定我是否理解你的问题。使用所有元素似乎微不足道,甚至是必要的。
-
@justinL 和 user2357112,我会将“不包括某些项目”本身视为元素。 [(1), (2, 3)] 可以被认为是 1 本身,我会在评估答案时明确检查该条件([if len(subset)==1 for subset in partition],做某事)作为一种可能性
标签: python math combinations subset