我该如何结束这个循环?

时间:2017-11-19 08:25:51

标签: python

我试图按字母顺序计算字符串的最长长度

s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
    if s[i] <= s[i+1]:
        current += 1
    else:
        if current > longest:
            longest = current
            current = 0
    i += 1
print longest

对于这个特定的字符串,'Current'以正确的长度4结束,但从不修改最长。

编辑:以下代码现在遇到错误

s = 'abcv'
current = 1
biggest = 0
for i in range(len(s) - 1):
    while s[i] <= s[i+1]:
        current += 1
        i += 1
    if current > biggest:
        biggest = current
    current = 0
print biggest

似乎我的逻辑是正确的,但我遇到某些字符串的错误。 :(

虽然互联网上有代码来源可以打印最长的字符串,但我似乎无法找到如何打印最长的字符串。

5 个答案:

答案 0 :(得分:1)

break将跳到循环后面(作为for语句的缩进。continue将跳转到循环开始并进行下一次迭代

else:语句中的逻辑不起作用 - 您需要将其缩进一次。

if s[i] <= s[i+1]:

检查“实际字符数是否小于或等于下一个字符” - 如果是这种情况,则需要增加内部计数器并设置最长时间

你可能会遇到if s[i] <= s[i+1]:的问题 - 你这样做直到len(s)-1"jfjfjf"len("jfjfjf") = 6 - 你会从0迭代到5 - 但if访问s[5]s[6]这就是项目。

一种不同的方法,无需覆盖显式索引并分为两个职责(获取字母子字符串列表,首先排序最长):

# split string into list of substrings that internally are alphabetically ordered (<=)
def getAlphabeticalSplits(s):
    result = []
    temp = ""
    for c in s: # just use all characters in s
        # if temp is empty or the last char in it is less/euqal to current char
        if temp == "" or temp[-1] <= c: 
            temp += c # append it to the temp substring
        else:
            result.append(temp) # else add it to the list of substrings
            temp = "" # and clear tem
    # done with all chars, return list of substrings
    return result


# return the splitted list as copy after sorting reverse by length
def SortAlphSplits(sp, rev = True):
    return sorted(sp, key=lambda x: len(x), reverse=rev)

splitter = getAlphabeticalSplits("akdsfabcdemfjklmnopqrjdhsgt")
print(splitter)
sortedSplitter = SortAlphSplits(splitter)
print (sortedSplitter)
print(len(sortedSplitter[0]))

输出:

['ak', 's', 'abcdem', 'jklmnopqr', 'dhs']
['jklmnopqr', 'abcdem', 'dhs', 'ak', 's']
9

这个返回分裂数组+按长度降序对它们进行排序。在关键环境中,这会花费更多的内存,因为您只缓存一些数字,而另一种方法填充列表并将其复制到已排序的列表中。

要解决您的代码索引问题,请稍微改变您的逻辑: 从第二个字符开始,测试前一个字符是否小于此值。这样你就可以用之前的那个来检查这个字符

s = 'abcvabcdefga'
current = 0
biggest = 0
for i in range(1,len(s)): # compares the index[1] with [0] , 2 with 1 etc
    if s[i] >= s[i-1]:    # this char is bigger/equal last char
        current += 1
        biggest = max(current,biggest)
    else: 
        current = 1

print biggest

答案 1 :(得分:0)

你必须编辑else语句。因为考虑情况,其中电流刚刚超过最长,即从current = 3 and longest =3开始,通过递增自身,电流变为4。 现在,您仍然希望它进入if current > longest声明

s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
    if s[i] <= s[i+1]:
        current += 1
    #else:
    if current > longest:
        longest = current
        current = 0
    i += 1
longest = current
print longest

答案 2 :(得分:0)

在循环结束时, current 是最后一个子字符串的升序长度。将其分配给最长是不对的,因为升序中的最后一个子串不一定是最长的。

循环后longest=max(current,longest)代替longest=current,应该为你解决。

编辑:^在编辑之前是。您只需要在for循环后添加longest=max(current,longest),原因相同(不考虑最后一个升序子字符串)。像这样:

s = 'abcv'
longest = 1
current = 1
for i in range (len(s) - 1):
    if s[i] <= s[i+1]:
        current += 1
    else:
        if current > longest:
            longest = current
            current = 0
    i += 1
longest=max(current,longest) #extra 
print longest

答案 3 :(得分:0)

使用while条件循环,然后您可以轻松定义循环完成的条件。 如果你想长期使用QualityCode: 虽然循环比休息更好,但因为你在一个地方看到了循环条件。在循环体之间识别简单的断裂往往更糟糕。

答案 4 :(得分:0)

当标签空间之后没有代码时,循环结束,所以从技术上讲,你的循环已经结束