Python:使用recusion打印一组

时间:2018-03-09 03:07:14

标签: python recursion set

我必须使用递归将列表更改为集合和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(列表):整数集,内部表示为列表

输出是以标准集合表示法打印一组。

1 个答案:

答案 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}})