Python 查找列表的所有可能子集的所有可能组合

Python 查找列表的所有可能子集的所有可能组合,python,math,combinations,subset,Python,Math,Combinations,Subset,我试图从一个列表中找到所有元素子集的组合,其中每个元素只使用一次 为了澄清我的意思,给出以下示例列表: [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,2,3)],…(对于许多人来说)] 主要的一点是,我只允许在给定的组合中使用每个元素一次。因此

我试图从一个列表中找到所有元素子集的组合,其中每个元素只使用一次

为了澄清我的意思,给出以下示例列表:

[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,2,3)],…(对于许多人来说)]

主要的一点是,我只允许在给定的组合中使用每个元素一次。因此,我不能:

[(1),(1,2,3)],因为元素1使用了两次

我一直在尝试对小n(n<10)使用暴力,但一直失败,使用python。在这一点上,它甚至不是一个运行时问题(小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],)]

递归!生成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,)]

在我看来,您只需要初始集的所有可能分区。我的目标是在所有答案中循环,并根据最终未使用的元素数量对它们进行评分,然后选择一组“最佳”子集。-那么,我不确定我是否理解你的问题。使用所有元素似乎很简单,甚至是必要的。@justinL和user2357112,我会将“不包括某些项”本身视为元素。[(1),(2,3)]可以被认为是1本身,我会在评估答案的可能性时明确地检查这个条件([如果len(subset)=1表示分区中的子集],做点什么。)是否可以修改这个条件,这样我就可以输入我自己的列表(或某个iterable),而不仅仅是某个数字?@user1639926:非常简单。只需将
(n,)
s替换为
(my_list[n],)
s,并调整函数的参数即可。@user2356112不完全确定这是什么意思?你能澄清一下吗?我的edit2在最初的帖子中反映了我的朋友为使它工作所做的改变。您的解决方案不同吗?@user1639926:略有不同,但本质上相当。