2013-10-24 22 views
4

我想弄清楚如何將字符串中的字符與字符串中的下一個字符進行比較。舉例來說,如果我有一個字符串:在Python中比較字符串中的字符

s = 'vzcbotdebobeggglakyl' 

我希望能夠到的第一個字符與第二個字符進行比較,如果第二個字符是大於或等於第一個字符(字母順序來講, < 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. 
+1

'begggl'但'g'不*大於*'g' ... :) –

+0

這是大於或等於到,這就是代碼所說的;)(Damnit,我一直按回車鍵發送註釋,而不是一個新行:P)我意識到我說如果字符大於,給計數器加一個,但是我的意思是大於或等於。 – Ernesto

+0

您的問題文本不正確,然後:「*我想能夠比較第一個字符和第二個字符,如果第二個字符更大*」:P –

回答

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開始,我們從第二個字符開始迭代字符串)。
  • 如果當前字符與前一字符「大於或等於」,我們將它添加到當前子字符串並繼續。
  • 如果不是,我們將當前子字符串添加到子字符串列表中,並使用當前字符對下一個子字符串進行種子處理。
  • 迭代結束後,不要忘記將當前子串添加到列表中。
+0

工程很好,但有幾個它不起作用的實例? – Ernesto

+0

@ Ernesto:你能更具體嗎? –

+1

s ='rdxkuqeshqwxahabrtvw'返回'hqwx'和4作爲最長的子字符串?它應該是'abrtvw'和6? – Ernesto

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) 
+0

我將看看明天一個,我覺得我的大腦已經大約從得到蒂姆的建議工作(好吧,我已經花了它的時間事先沒有幫助)爆炸。感謝您的努力,我保證我會得到解決的望着你的答案。我感謝你的時間。 – Ernesto