2016-06-07 37 views
2

我已经编写了一个简单的python程序的所有组合:的Python itertools.combinations_with_replacement不返回

#!/usr/bin/env python3.5 
import sys, itertools 

sCharacters = '123' 
for iCombinationLength in range(0, len(sCharacters)+1): 
    for aCombination in itertools.combinations_with_replacement(sCharacters, iCombinationLength): 
    print(''.join(aCombination)) 

此输出以下:

1 
2 
3 
11 
12 
13 
22 
23 
33 
111 
112 
113 
122 
123 
133 
222 
223 
233 
333 

然而它是数目的所有组合1 2和3,它将需要包括:

311 
312 
313 
321 
322 
323 
331 
332 
333 

正如你可以看到上面,它确实不是。我已经看到其他文章给出了combination_with_replacement函数给出的解决方案,以获得所有可能的字符组合传递。但这似乎并没有发生。我在这里做错了什么,以及如何获得字符变量中所有可能的字符组合?

感谢您的时间;-)

回答

2

“组合”是一个命令不敏感的术语;如果您有113,那么您不需要131311,因为它们都是相同的“组合”(如果combinations_with_replacement的输入序列是唯一的,则可以在转换为collections.Counter后将输出视为所有唯一值;无论顺序如何,两个1 s和一个3只是collections.Counter({1: 2, 3:1}))。

如果你想的combinations_with_replacement的顺序敏感版本(所以113131311都是独立的输出),使用itertools.productrepeat参数(repeat必须由关键字被传递由于product,在那里它需要可变长度设计位置参数):

sCharacters = '123' 
for iCombinationLength in range(0, len(sCharacters)+1): 
    for aCombination in itertools.product(sCharacters, repeat=iCombinationLength): 
    print(''.join(aCombination)) 
+0

完美!感谢您的解决方案,非常感谢。 – user2109254

+0

如果您想了解更多关于'itertools.product'实际正在做什么的内容,请阅读[笛卡尔产品](https://en.wikipedia.org/wiki/Cartesian_product)。 – pzp