如何在Python中获取字符串的所有连续子字符串?

lqh*_*gbl 33 python string substring python-2.7

这是我的代码,但我想要一个更好的解决方案,您如何看待这个问题?

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 alist

print get_all_substring('abcde')
Run Code Online (Sandbox Code Playgroud)

the*_*eye 40

我能想到的唯一改进就是使用像这样的列表理解

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')
Run Code Online (Sandbox Code Playgroud)

你和我的时间比较

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 alist

def 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 timeit
print timeit("get_all_substrings('abcde')", "from __main__ import get_all_substrings")
# 3.33308315277
print timeit("get_all_substrings_1('abcde')", "from __main__ import get_all_substrings_1")
# 2.67816185951
Run Code Online (Sandbox Code Playgroud)

  • OP的代码仅提供连续的子字符串。 (2认同)

小智 11

可以简洁地完成 itertools.combinations

from itertools import combinations

def get_all_substrings_2(string):
    length = len(string) + 1
    return [string[x:y] for x, y in combinations(range(length), r=2)]
Run Code Online (Sandbox Code Playgroud)

  • 这也比当前选择的答案性能更高。 (2认同)

Joh*_*ooy 9

您可以将其编写为生成器,以便在不需要时立即将所有字符串存储在内存中

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
Run Code Online (Sandbox Code Playgroud)

如果你真的需要,你仍然可以列出一个清单

alist = list(get_all_substrings("abcde"))
Run Code Online (Sandbox Code Playgroud)

可以减少该函数以返回生成器表达式

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))
Run Code Online (Sandbox Code Playgroud)

或者,如果您不关心内存,当然可以更改两个字符以返回列表

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)]
Run Code Online (Sandbox Code Playgroud)

  • 这救了我,我遇到了内存错误,做了一些搜索,找到了您的解决方案,它也解决了我的问题。谢谢。 (2认同)

Pau*_*McG 5

我从来没有喜欢过range(len(seq)),使用枚举和使用索引值如何:

def indexes(seq, start=0):
    return (i for i,_ in enumerate(seq, start=start))

def gen_all_substrings(s):
    return (s[i:j] for i in indexes(s) for j in indexes(s[i:], i+1))

def get_all_substrings(string):
    return list(gen_all_substrings(string))

print(get_all_substrings('abcde'))
Run Code Online (Sandbox Code Playgroud)