Python中带冻结集的Powerset
我在这里坐了将近5个小时试图解决这个问题,现在我希望你的帮助 以下是我的Python代码: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})
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))