Python中按顺序逐个比较字符串中的字符

4

我将尝试解释如何比较字符串中的字符和下一个字符。例如,如果我有一个字符串:

s = 'vzcbotdebobeggglakyl'

我希望能够比较字符串的第一个字符和第二个字符,如果第二个字符大于等于第一个字符(按字母顺序排序,a < b,g > e,y = y等),我想要将另一个变量(基本上是计数器)加1。如果不是,则将计数器重置为0。并在整个过程中重复此过程。如果计数器变得大于maxlen变量,则将maxlen加1(或使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.

1
beggglg 不是 大于 g... :) - Jon Clements
它是大于或等于,这就是代码的意思 ;) (该死,我一直按回车键发送评论而不是新行:P)我意识到我说过如果字符大于,则将计数器加一,但我的意思是大于或等于。 - Ernesto
如果您的问题文本不正确,那么应该是:“我想要能够比较第一个字符和第二个字符,如果第二个字符更大”。 :P - Jon Clements
@GarethRees,“whinning”是什么意思?请问它是“whipping”的比喻吗? - eyquem
2个回答

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)

明天我会看一下,我觉得我的大脑已经快要爆炸了,因为我已经花了很多时间让Tim的建议起作用(之前花费的时间也没有帮助)。感谢你的努力,我保证我会找时间看看你的答案。非常感谢你的时间。 - Ernesto

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开始,并且我们从第二个字符开始迭代字符串)。
  • 如果当前字符“大于或等于”上一个字符,则将其添加到当前子串中并继续进行。
  • 否则,我们将当前子串添加到子串列表中,并使用当前字符生成下一个子串。
  • 迭代结束后,不要忘记将当前子串添加到列表中。

工作得很好,但有几个实例它没有起作用? - Ernesto
1
s = 'rdxkuqeshqwxahabrtvw' 返回的是 'hqwx' 和 4 作为最长子字符串吗?实际上应该是 'abrtvw' 和 6。 - Ernesto
1
s = 'abcdefghijklmnopqrstuvwxyz' 也会返回一个错误 ValueError: max() arg is an empty sequence - Ernesto
也许我做错了什么,但如果我输入一个字符串(例如a = 'dghertsds'),使用更新的公式,屏幕上将不会显示任何内容。 - Ernesto
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)) print(longest_ascending('dghertsds')) - Ernesto
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接