2015-07-11 96 views
0

问题生成列表的长度1..1 /串

我有一个字符串,我想找到长度为1..n的每一个可能的子集的每一个可能的子集。

由于字符串 “abc” 和n=3,我想产生以下列表:

{"a", "b", "c", "aa", "ab", "ac", "ba", ..., "aaa", "aab", "aac", "aba" ..., "ccc"}

我尝试

...是痛苦的新手。每n一个循环,嵌套n次。

n = 3时,我有:

characters = "abcdef" # and so on 

for char in characters: 
    print(char) 

for char1 in characters: 
    for char2 in characters: 
     print(str(char1) + str(char2)) 

for char1 in characters: 
    for char2 in characters: 
     for char3 in characters: 
      print(str(char1) + str(char2) + str(char3)) 

正如你所看到的,这是不可扩展的,至少可以说。有没有一个很好的方法来做到这一点?任何复杂度的减少也会很酷,尽管我很难想象任何东西。

+0

呃,你可以使用['itertools'](https://docs.python.org/2/library/itertools.html)中的东西吗? – NightShadeQueen

回答

2

itertools.product是你需要的。使用"".join"将字符连接到单个字符串中。

>>> import itertools 
>>> n = 3 
>>> s = "abc" 
>>> for i in range(n): 
    print(["".join(prod) for prod in itertools.product(s, repeat = i + 1)]) 


['a', 'b', 'c'] 
['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc'] 
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 
1

使用python我建议循环遍历从1到n的i和循环遍历从1到n-i的j,并在每次迭代中打印从j开始到j + i结束的子字符串。 substring在python中有点奇怪,所以你必须将它从j切片到 - (n-(j + i))。

尽管您可能需要调整边界条件,但这几乎是您想要的。