【问题标题】:Finding all possible combination of all possible subsets of lists查找所有可能的列表子集的所有可能组合
【发布时间】: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


【解决方案1】:

递归!生成 1..n 的所有可能的分区,然后使用这些来生成 1..n+1 的所有可能的分区:

def partitions(n):
    if n == 0:
        yield []
    else:
        for partial_partition in partitions(n-1):
            for i in range(len(partial_partition)):
                copy_partition = partial_partition[:]
                copy_partition[i] += (n,)
                yield copy_partition
            yield partial_partition + [(n,)]

【讨论】:

  • 是否可以修改它以便我可以输入自己的列表(或一些可迭代的),而不仅仅是一些数字?
  • @user1639926:很简单。只需将(n,)s 替换为(my_list[n],)s 并调整函数的参数即可。
  • @user2356112 不确定您的意思是什么?你能澄清一下吗?我在原始帖子中的 edit2 反映了我的朋友为使其正常工作所做的更改。你的解决方案有什么不同吗?
  • @user1639926:略有不同,但基本相同。
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 2022-12-31
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多