2

itertools 函数没有错误,但一旦完成,它也不会打印任何内容。我的代码是:

def comb(iterable, r):
    pool = tuple(iterable)
    n = len(pool)
    for indices in permutations(range(n), r):
        if sorted(indices) == list(indices):
            print (indices)
            yield tuple(pool[i] for i in indices)

我包含了打印语句,但它没有打印它计算的总组合。

4

2 回答 2

3

您需要阅读生成器的工作原理。当您调用comb()它时,它会返回一个生成器对象。然后,您需要对生成器对象执行某些操作以获取从中返回的对象。

from itertools import permutations

lst = range(4)
result = list(comb(lst, 2))  # output of print statement is now shown

print(result) # prints: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

comb()返回一个生成器对象。然后,list()迭代它并收集列表中的值。在迭代时,您的 print 语句会触发。

于 2012-04-18T03:02:05.843 回答
1

它返回一个生成器对象。如果您遍历它,您将看到打印。例如:

for x in comb(range(3),2):
    print "Printing here:", x

给你:

(0, 1) # due to print statement inside your function
Printing here: (0, 1)
(0, 2) # due to print statement inside your function
Printing here: (0, 2)
(1, 2) # due to print statement inside your function
Printing here: (1, 2)

因此,如果您只想逐行打印组合,请删除函数内的 print 语句,然后将其转换为列表或遍历它。您可以将这些逐行打印为:

print "\n".join(map(str,comb(range(4),3)))

给你

(0, 1, 2)
(0, 1, 3)
(0, 2, 3)
(1, 2, 3)
于 2012-04-18T03:00:07.413 回答