2015-07-11 95 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))。

儘管您可能需要調整邊界條件,但這幾乎是您想要的。