我必须使用递归将列表更改为集合和powerset。我的代码适用于powerset,但我不能让它在我们开始的集合上工作。这是我的代码:
def printSet(A):
if type(A) == int:
return A
elif len(A) == 1:
return {}
else:
elementA = A.pop()
return str(printSet(A))+ ',' + str(set(elementA))
print('{' + str(printSet(A)),end='}');
我可以让代码适用于下面的第二个示例,但不适用于下面的第一个示例:
>>> printSet ([1,2,3,4])
{1, 2, 3, 4}
>>> printSet ([[1,2], [1,3]]
{{1, 2}, {1, 3}}
输入是: 参数:A(列表):整数集,内部表示为列表
输出是以标准集合表示法打印一组。
答案 0 :(得分:0)
powerset定义为P(s) = {{}, {s_1}, {s_2}, ... {s_1, s_2},.., s}
。要在递归中实现它,最好使用生成器表达式。此外,Python中的集合不可用,因此,您必须创建自己的集合包装器:
class WrapperSet:
def __init__(self, *args):
self.val = set() if not args else args
def __repr__(self):
return "{}({})".format(self.__class__.__name__, str(self))
def __str__(self):
return '{'+', '.join(map(str, self.val))+'}'
def get_result(s):
result = list(p(s))
current = sorted([a for i, a in enumerate(result) if a not in result[:i]], key=len)
return WrapperSet(*[WrapperSet(), *[WrapperSet(*i) for i in current]])
def p(s, current = []):
if len(s) == len(current):
yield current
else:
for i in s:
yield [i]
if i in current:
yield current
else:
yield from p(s, sorted(current+[i]))
输出:
print(get_result([1, 2, 3]))
输出:
WrapperSet({{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}})