2016-04-25 11 views
4

文字列をn個の部分文字列に分割し、それらのタプルのリストを返すように訓練しています。'n'部分文字列の網羅的リストの作成

コード for (w1,w2) in [(w[:i],w[i:]) for i in range(len(w))]ここで、wは、その単語を含む変数です。 w='house'のであれば、これは、単一の分割など'ho','u','se'のように文字列の[('','house'),('h','ouse')など。

これは、文字列のすべての可能なペアに文字列を分割するために完璧に動作しますが、今、私は他の分割(例えばn=3)したいが返されます。文字列をn部分文字列のすべての可能な方法に変換します。どのように効率的に行うことができますか?ここで

答えて

4

発電機を使用して、再帰的に、これを行うための一つの方法です:

def split_str(s, n): 
    if n == 1: 
    yield (s,) 
    else: 
    for i in range(len(s)): 
     left, right = s[:i], s[i:] 
     for substrings in split_str(right, n - 1): 
     yield (left,) + substrings 

for substrings in split_str('house', 3): 
    print substrings 

これはアウト出力します

('', '', 'house') 
('', 'h', 'ouse') 
('', 'ho', 'use') 
('', 'hou', 'se') 
('', 'hous', 'e') 
('h', '', 'ouse') 
('h', 'o', 'use') 
('h', 'ou', 'se') 
('h', 'ous', 'e') 
('ho', '', 'use') 
('ho', 'u', 'se') 
('ho', 'us', 'e') 
('hou', '', 'se') 
('hou', 's', 'e') 
('hous', '', 'e') 

あなたは空の文字列を使用しない場合は、ループ境界を変更〜

for i in range(1, len(s) - n + 2):