我正在尝试实现一个算法来获取长度为n
的字符串,并返回长度为2或更大的所有子字符串。
如果用户输入一个字符串,例如“abcd”,那么输出应该是 ab,bc,cd,abc,bcd,abcd。
a=input("Ente the input")
list=[]
com=""
for k in range(2,len(a)+1):
for x in range(k,len(a)+1):
com=""
for j in range(x-k,k);
com=com+a[j]
print com
list1.append(com)
print list1
答案 0 :(得分:2)
>>> [ a[ index : index + length ] for index in range( len( a ) - 1 ) for length in range( 2, len( a ) - index + 1 ) ]
['ab', 'abc', 'abcd', 'bc', 'bcd', 'cd']
如果您需要列出的列表:
>>> sorted( [ a[ index : index + length ] for index in range( len( a ) - 1 ) for length in range( 2, len( a ) - index + 1 ) ], key = len )
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']
您的算法存在严重问题,因为它应该只执行两个循环(一个用于启动索引,一个用于子串的长度)。但是,我不明白你想要做什么,所以我不能尝试修复它。
编辑:我明白了 - 你是逐个字符地复制字符串!你是一个C程序员吗? = p你不必在Python中做那种事情;它是一种更高级的语言。如果切片字符串(a[1:3]
),您将获得它的子字符串,您可以将其附加到列表或以其他方式存储。在上面,我们首先遍历所有索引直到字符串的末尾(减去1,因为“d”不是有效的子字符串),然后遍历所有“适合”的子字符串长度。这会产生所有可能的子串;我们可以使用列表理解符号来很容易地列出它们。
答案 1 :(得分:2)
from itertools import combinations
map(lambda i: a[i[0]:i[1]+1],combinations(range(len(a)),2))
答案 2 :(得分:1)
minlength = 2
def sub(string):
return [string[start:start+length]
for length in xrange(minlength, len(string) + 1)
for start in xrange(len(string) - length + 1) ]
print sub('abcd')
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']
答案 3 :(得分:0)
如果要输出从最短到最长的结果
>>> s="abcd"
>>> for substrlength in range(2, len(s)+1):
... for start in range(len(s)+1-substrlength):
... print s[start:start+substrlength]
...
ab
bc
cd
abc
bcd
abcd
将结果存储在列表中
>>> s="abcd"
>>> resultlist=[]
>>> for substrlength in range(2, len(s)+1):
... for start in range(len(s)+1-substrlength):
... resultlist.append(s[start:start+substrlength])
...
>>> print resultlist
['ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']
答案 4 :(得分:0)
以下是要比较的代码的错误修复版本,但有更好的方法可以在此处编写
a=raw_input("Enter the input")
list1=[]
com=""
for k in range(2,len(a)+1):
for x in range(k,len(a)+1):
com=""
for j in range(x-k,x):
com=com+a[j]
print com
list1.append(com)
print list1
答案 5 :(得分:0)
在python 2.6中,他们添加了一些很酷的功能,使这很容易:
from itertools import combinations
def substrings(text, length=2):
textlen = len(text)
for low, hi in combinations(range(textlen), 2):
if hi-low >= length:
yield text[low:hi]
s = raw_input("Enter the input: ")
for substr in substrings(s):
print len(substr), repr(substr)
请注意,substrings()
是一个生成器(请参阅yield
语句),这样可以提高内存效率,但如果您确实需要列表,则可以说mylist = list(substrings('foo'))
如果您想要生成其他长度的子串,我还为子串添加了一个参数。
答案 6 :(得分:0)
一个简洁的递归版本,很好的衡量标准:
def substr(s, min_len):
if len(s) < min_len:
return []
return [s[i:i+min_len] for i in range(len(s) - min_len + 1)] + substr(s, min_len + 1)