Powerset与Python中的frozenset

时间:2014-10-26 17:39:39

标签: python

我在这里坐了将近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'})}

我不想使用库,它应该是递归的!

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

这是使用itertools稍微更具可读性的实现,如果您不想使用lib进行组合,则可以将组合代码替换为其实现,例如:来自https://docs.python.org/2/library/itertools.html#itertools.combinations

def powerset(l):
    result = [()]
    for i in range(len(l)):
        result += itertools.combinations(l, i+1)
    return frozenset([frozenset(x) for x in result])

测试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()})

答案 1 :(得分:0)

你有正确的想法。如果a非空,那么可以通过从a获取一些元素s来形成a的powerset,并让我们调用rest上剩下的内容。然后在s rest本身subset powerset3(rest) subset中为每个subset | frozenset({s})添加subset | frozenset({s})的{​​{1}}版本frozenset。 }。

最后一点,执行pop()而不是字符串连接是解决方案所缺少的一半。另一个问题是基本情况。空集的powerset是空集,是包含空集的一个元素的集合。

您的解决方案的另一个问题是,您尝试以可变的方式使用b |= something,这是不可变的(例如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)) ,{{1}}等。)

这是一个有效的解决方案:

{{1}}