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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用标准设置符号打印'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
答案

您的打印功能不起作用。改变它打印(设置(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))创建的列表中的值)

另一答案

首先,您应该尝试改进变量命名,使其更具描述性。不要使用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}, {}}
另一答案

如前所述,你循环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)

以上是关于使用标准设置符号打印'set'的主要内容,如果未能解决你的问题,请参考以下文章

scarpy设置日志打印级别和存储位置

Python:如果XML标签不存在,我需要打印'Blank'和Output

关于MATLAB读取端口数据的问题

没有为类'Person'定义方法'set_age'。飞镖

webstrom vue 不认识@符号

请问set_param()函数最后一个参数设置的问题 set_param('文件/元件','参数名','0.1'); 最后一个值是数字就