0

我只是想输出 a 的内容set(因为我必须使用这种被诅咒且不灵活的类型),但每次我去做或循环并打印每个元素时,我都会得到最后一个而不是其余的。这是我的整个代码:

def factorial(n):
    r = 1
    for i in range(1, n + 1):
        r *= i
    return r

def nCr(n, r):
    return factorial(n) / (factorial(r) * factorial(n - r))

def combinations(s, tokens):
    maxcombos = int(nCr(len(s), tokens))
    for index in range(maxcombos):
        token_copy = tokens
        combo = []
        for val in range(1, len(s) + 1):
            if not token_copy:
                break
            thresh = nCr(len(s) - val, token_copy - 1)
            if index < thresh:
                combo.append(s.pop())
                token_copy -= 1
            else:
                index -= thresh
        yield tuple(combo)

def powerset(s):
    pset = set()
    for num_tokens in range(1, len(s)):
        for combo in combinations(s, num_tokens):
            pset.add(combo)
    pset.update(s)
    #pset.update(tuple())
    return pset

if __name__ == '__main__':
    s = set([1,2,23])
    p = powerset(s)
    msg = "Initial set: set(["
    for (i, item) in enumerate(s):
        msg += str(item) + ", "
    msg += "])"
    print(msg)
    #print(powerset())

我只是希望每个人都([])像正常的集合一样出现在它们之间。有没有办法简单地输出整个变量及其内容?谢谢!

4

2 回答 2

2

你的powerset函数实际上改变了它的输入。在combinations,你使用s.pop(). 这几乎肯定是错误的,并且可以解释为什么当您尝试打印它时它的内容发生了变化。

最简单的解决方法是用文档 powerset中的配方替换您的函数:http: //docs.python.org/2/library/itertools.html#recipesitertools

from itertools import chain, combinations
def powerset(input_set):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(input_set)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
于 2013-10-10T23:47:46.120 回答
1

将组合定义的顶部更改为以下内容:

def combinations(r, tokens):
    s = set(r)
    # everything else you had

这将创建一个不会在组合函数中更改的新集合。之前对其进行更改的原因是因为组合中的局部变量是对函数外部同一对象的引用。如果两个名称引用同一个对象,改变一个会影响另一个。

您主要需要以下内容:

for (i, item) in enumerate(s):
    msg += str(item) + ", "
msg = msg[:-2]
msg += "])"
于 2013-10-10T23:54:06.487 回答