使用标准设置符号打印'set'

时间:2018-03-01 04:11:34

标签: python recursion printing set

我必须使用标准设置表示法打印一组。我应该使用递归,并且必须在某处有一个基本情况。最终答案应该作为一个集合出现,我必须打印而不添加新行。

这是一个打算输出随机整数的函数的函数。第一个函数构建随机整数,第二个函数构建powerset,而最后一个函数打印集合。我有前两个函数以及最后一个函数,但是当我运行代码时,它有时会打印一组,其他时间会出现空白。我不知道我做错了什么?

一切都是这样开始的:

from random import *

def randomSet (n, up):
    return sample(range(up), n)


def powerset (A):
    if A == []:
        return [[]]
    aoba = A[0]
    imax = powerset(A[1:])
    doggo = []
    for set in imax:
        doggo.append([aoba] + set)
    return doggo + imax


def printSet (A):
    for i in range(len(A)):
        if i in A:
          print ((set(A)),end="")

有一个测试人员功能我没有放在这里,但重点是我的代码不能一直正常工作。有时它会像这样运行:

The powerset of 
{0, 38, 58, 30, 24}
is 
#supposed to show the powerset of the set above but it is always blank

有时它会像这样运行:

The powerset of 
#nothing....just nothing!!!
is 
#never anything here

3 个答案:

答案 0 :(得分:1)

您的打印功能不起作用。改变它打印(设置(A)),你将是金色的。以下是无法解决的原因:

def printSet (A):

    # range(len(A)) produces a list of the range of values [0,1,2,3,... len(A)]
    # and then iterates over it, so I starts at 0 in the loop, then goes
    # to 1, then 2, etc.
    for i in range(len(A)):

        # so here, you are checking if 0 is in your set on the first iteration
        # then 1, then 2 etc  and you print out the values of it is.
        if i in A:
            print ((set(A)),end="")

所以当集合中没有一个数字在零到你的集合长度范围内时你的函数失败

例如{32,24,10}将永远不会打印,因为这些值都不等于0,1或2(在此示例中,这是由范围(set(A))创建的列表中的值)

答案 1 :(得分:1)

如前所述,您循环range然后测试这些数字是否在集合中,但该检查没有意义。相反,您应该循环元素并直接打印它们。

def printSet (A):
    for i in A:
        print(set(i), end="")

但是这并没有真正打印出“标准集符号”中的那些。例如,缺少周围的{...},空集将打印为set()。相反,你可以使用这样的东西:

def printSet (A):
    print("{" + ", ".join(str(set(i)) if i else "{}" for i in A) + "}")

printSet(powerset(randomSet(5, 10)))的输出:

{{8, 9, 5, 6, 0}, {8, 9, 5, 6}, {8, 9, 5, 0}, {8, 9, 5}, {8, 0, 5, 6}, {8, 5, 6}, {8, 0, 5}, {8, 5}, {8, 9, 6, 0}, {8, 9, 6}, {8, 9, 0}, {8, 9}, {8, 0, 6}, {8, 6}, {8, 0}, {8}, {0, 9, 5, 6}, {9, 5, 6}, {0, 9, 5}, {9, 5}, {0, 5, 6}, {5, 6}, {0, 5}, {5}, {0, 9, 6}, {9, 6}, {0, 9}, {9}, {0, 6}, {6}, {0}, {}}

对于更多级别的嵌套,您可以创建递归函数。请注意,结果不是print而是return,即您必须print(tostr(...))

def tostr(A):
    if isinstance(A, (list, tuple, set, frozenset)):
        return "{" + ", ".join(map(tostr, A)) + "}"
    else:
        return str(A)

答案 2 :(得分:1)

首先,您应该尝试改进变量命名,使其更具描述性。请勿使用set作为变量名称,因为它会删除Python的set()函数。

主要问题是,如果使用Python set(),则空集将显示为set()而不是{}

您将函数传递给列表。每个列表都包含数字。目的是用{}以及整个事物包装每个数字列表。因此,一种方法是首先将每个数字转换为字符串。最简单的方法是使用Python的map()函数。这将函数应用于列表中的每个项目a返回结果列表。在这种情况下,我们可以应用str函数将项转换为字符串。结果将是:

['1', '2', '3']

使用此功能,您可以使用join()创建单个字符串:

', '.join(['1', '2', '3'])

会给你一个字符串:

'1, 2, 3'

然后你需要用{}包装它。最后,输出powerset也需要包装:

def printSet(A):
    print('{' + ', '.join('{' + ', '.join(map(str, a_set)) + '}' for a_set in A) + '}')

r = random_set(3, 50)
printSet(powerset(r))

这会显示如下内容:

{{32, 41, 10}, {32, 41}, {32, 10}, {32}, {41, 10}, {41}, {10}, {}}