在Python中按顺序比较字符串中的字符

时间:2013-10-24 09:39:44

标签: python

我试图弄清楚如何将字符串中的字符与字符串中的下一个字符进行比较。例如,如果我有一个字符串:

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.

2 个答案:

答案 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开始,我们从第二个字符开始迭代字符串。)
  • 如果当前字符与前一个字符“大于或等于”,我们将其添加到当前子字符串并继续。
  • 如果没有,我们将当前子字符串添加到子字符串列表中,并使用当前字符播种下一个子字符串。
  • 迭代结束后,不要忘记将当前子字符串添加到列表中。