Python中带冻结集的Powerset

Python中带冻结集的Powerset,python,Python,我在这里坐了将近5个小时试图解决这个问题,现在我希望你的帮助 以下是我的Python代码: def powerset3(a): if (len(a) == 0): return frozenset({}) else: s=a.pop() b=frozenset({}) b|=frozenset({}) b|=frozenset({s})

我在这里坐了将近5个小时试图解决这个问题,现在我希望你的帮助

以下是我的Python代码:

   def powerset3(a):

       if (len(a) == 0):
           return frozenset({})
       else:
           s=a.pop()
           b=frozenset({})
           b|=frozenset({})
           b|=frozenset({s})
           for subset in powerset3(a):

              b|=frozenset({str(subset)})
              b|=frozenset({s+subset})
           return b
如果我使用以下命令运行程序:

    print(powerset3(set(['a', 'b'])))
我得到以下解决方案

    frozenset({'a', 'b', 'ab'})
但是我想要

    {frozenset(), frozenset({'a'}), frozenset({'b'}), frozenset({'b', 'a'})}
我不想使用库,它应该是递归的


感谢您的帮助

这里有一个使用
itertools
的可读性稍高的实现,如果您不想为组合使用库,您可以使用其实现替换组合代码,例如从

在不同长度的IPython上进行测试

In [82]: powerset(['a', 'b'])
Out[82]:
frozenset({frozenset(),
           frozenset({'b'}),
           frozenset({'a'}),
           frozenset({'a', 'b'})})

In [83]: powerset(['x', 'y', 'z'])
Out[83]:
frozenset({frozenset(),
           frozenset({'x'}),
           frozenset({'x', 'z'}),
           frozenset({'y'}),
           frozenset({'x', 'y'}),
           frozenset({'z'}),
           frozenset({'y', 'z'}),
           frozenset({'x', 'y', 'z'})})

In [84]: powerset([])
Out[84]: frozenset({frozenset()})

你的想法是对的。如果
a
为非空,则
a
的动力集可以通过从
a
中提取一些元素
s
来形成,我们称之为剩余的
rest
。然后为
powerset3(rest)
中的每个
子集
subset
本身和
subset | frozenset({s})
添加到
rest
的powerset,从而从
rest
的powerset中构建
s

最后一点,用
subset | frozenset({s})
代替字符串连接是您的解决方案缺少的内容的一半。另一个问题是基本情况。空集的动力集不是空集,而是包含空集的一个元素的集合

您的解决方案的另一个问题是,您试图以可变的方式(例如,
pop()
b|=something
等)使用不可变的
frozenset

这里有一个可行的解决方案:

from functools import partial

def helper(x, accum, subset):
    return accum | frozenset({subset}) | frozenset({frozenset({x}) | subset})

def powerset(xs):
    if len(xs) == 0:
        return frozenset({frozenset({})})
    else:
        # this loop is the only way to access elements in frozenset, notice
        # it always returns out of the first iteration
        for x in xs:
            return reduce(partial(helper, x), powerset(xs - frozenset({x})), frozenset({}))        

a = frozenset({'a', 'b'})
print(powerset(a))

我想你想在不使用任何库的情况下执行此操作?是的,不使用库和递归!你应该在你的问题中加上这个
from functools import partial

def helper(x, accum, subset):
    return accum | frozenset({subset}) | frozenset({frozenset({x}) | subset})

def powerset(xs):
    if len(xs) == 0:
        return frozenset({frozenset({})})
    else:
        # this loop is the only way to access elements in frozenset, notice
        # it always returns out of the first iteration
        for x in xs:
            return reduce(partial(helper, x), powerset(xs - frozenset({x})), frozenset({}))        

a = frozenset({'a', 'b'})
print(powerset(a))