我试图弄清楚如何将字符串中的字符与字符串中的下一个字符进行比较。例如,如果我有一个字符串:
s = 'vzcbotdebobeggglakyl'
我希望能够将第一个字符与第二个字符进行比较,如果第二个字符大于或等于第一个字符(按字母顺序,a< b,g> e,y = y,等)我想将1添加到另一个变量(基本上是一个计数器)。如果不是,我想将计数器重置为0.并且基本上重复整个过程的字符串长度。如果计数器变得大于maxlen变量,则向maxlen添加一个(或者使maxlen = sublen)。到目前为止我的尝试是(而且我认为它有效):
s = 'vzcbotdebobeggglakyl'
sublen = 1
maxlen = 0
startnum = 0
for char in s:
stopnum = startnum + 1
if stopnum < len(s):
charone = s[startnum]
chartwo = s[stopnum]
if charone <= chartwo:
sublen += 1
startnum += 1
if sublen > maxlen:
maxlen = sublen
else:
startnum +=1
sublen = 1
else:
sublen = 0
print 'Longest substring is', maxlen, 'characters.'
现在,我还想做的是打印出一行字符串。我已经在这个工作了五个小时,但是无法做到这一点。我尝试了很多不同的事情,我现在基本上比我开始时更加困惑。在上面的例子中,我希望它说
Longest substring is begggl, which is 6 characters.
答案 0 :(得分:2)
这不太明显,但似乎有效:
seq = "vzcbotdebobeggglakyl"
import itertools
result = max(
(
list(next(sub)) + [b for a, b in sub]
for ascending, sub in itertools.groupby(zip(seq,seq[1:]), lambda x: x[0] <= x[1])
if ascending
),
key=len
)
print ''.join(result)
答案 1 :(得分:1)
这个怎么样:
def longest_ascending(s):
matches = []
current = [s[0]]
for index, character in enumerate(s[1:]):
if character >= s[index]:
current.append(character)
else:
matches.append(current)
current = [character]
matches.append(current)
return "".join(max(matches, key=len))
<强>说明:强>
matches
是包含“升序”字符的所有子字符串的列表。current
是在迭代字符串时构建的升序字符的子字符串。我们从字符串的第一个字符开始。enumerate()
帮助我们跟踪上一个字符的索引(因为枚举从0
开始,我们从第二个字符开始迭代字符串。)