How To Get All The Contiguous Substrings Of A String In Python?
The only improvement I could think of is, to use list comprehension like this
def get_all_substrings(input_string): length = len(input_string) return [input_string[i:j+1] for i in xrange(length) for j in xrange(i,length)]print get_all_substrings('abcde')
The timing comparison between, yours and mine
def get_all_substrings(string): length = len(string) alist = [] for i in xrange(length): for j in xrange(i,length): alist.append(string[i:j + 1]) return alistdef get_all_substrings_1(input_string): length = len(input_string) return [input_string[i:j + 1] for i in xrange(length) for j in xrange(i,length)]from timeit import timeitprint timeit("get_all_substrings('abcde')", "from __main__ import get_all_substrings")# 3.33308315277print timeit("get_all_substrings_1('abcde')", "from __main__ import get_all_substrings_1")# 2.67816185951
can be done concisely with itertools.combinations
from itertools import combinationsdef get_all_substrings_2(string): length = len(string) + 1 return [string[x:y] for x, y in combinations(range(length), r=2)]
You could write it as a generator to save storing all the strings in memory at once if you don't need to
def get_all_substrings(string): length = len(string) for i in xrange(length): for j in xrange(i + 1, length + 1): yield(string[i:j]) for i in get_all_substrings("abcde"): print i
you can still make a list if you really need one
alist = list(get_all_substrings("abcde"))
The function can be reduced to return a generator expression
def get_all_substrings(s): length = len(s) return (s[i: j] for i in xrange(length) for j in xrange(i + 1, length + 1))
Or of course you can change two characters to return a list if you don't care about memory
def get_all_substrings(s): length = len(s) return [s[i: j] for i in xrange(length) for j in xrange(i + 1, length + 1)]