2016-04-25 3 views
4

Я тренируюсь, чтобы разбить строку на n подстрок и вернуть список кортежей из них.Создание исчерпывающего списка подстрок `n`

Теперь я использую код for (w1,w2) in [(w[:i],w[i:]) for i in range(len(w))] где w - это переменная, которая содержит слово. Так что, если w='house' то это вернет [('','house'),('h','ouse') и т.д ..

Это прекрасно работает для разбиения строки на все возможные пары строк, но теперь я хочу, чтобы другие расколы (например n=3) строки, такие как 'ho','u','se', которые расщепляются один строка во все возможные варианты подстрок. Как я могу сделать это эффективно?

ответ

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): 
Смежные вопросы