python
  • string
  • python-2.7
  • substring
  • 2014-06-16 80 views 0 likes 
    0

    當爲給定任務執行我的代碼時,我會持續獲取最長的字符串和迭代中的下一個字母。例如,如果我用查找給定字符串中按字母順序排列的字母的最長子串

    s = 'azcbobobegghakl' 
    

    我會得到"beggha"作爲最長的字符串,當答案應該是"beggh"。我嘗試過的所有隨機字母串都會發生同樣的錯誤。

    我發現在「result + = letters」語句後附加了額外的字母,但我不知道如何解決它。這裏是我的代碼:

    s = 'azcbobobegghakl' 
    result = [] 
    final = [] 
    for letters in s: 
        result += letters 
        if result == sorted(result) and len(result) >= len(final): 
         final=result 
        elif result != sorted(result): 
         result = [result[len(result)-1]] 
    print "".join(final) 
    
    +1

    我真的不知道爲什麼這個問題值得贊成。雖然這顯然是功課,但OP表明了一個明確的問題,並努力自行解決。不知道增強賦值運算符的微妙之處是否值得低估? – timgeb

    回答

    2

    這裏的問題是,resultfinal指向同一個列表。 你可能在想,當你發出result += letters+=將創建一個新的列表,但它不會:

    >>> x = [1,2] 
    >>> y = x 
    >>> x += [3] 
    >>> x 
    [1, 2, 3] 
    >>> y 
    [1, 2, 3] 
    >>> x is y 
    True 
    

    但是,當您使用x = x + [3]

    >>> x = [1,2] 
    >>> y = x 
    >>> x = x + [3] 
    >>> x 
    [1, 2, 3] 
    >>> y 
    [1, 2] 
    >>> x is y 
    False 
    

    有關此行爲的解釋,請參閱this問題。這是正在發生的事情你for環(編輯:您原來的代碼)時letters是最後a字符在您的字符串:

    1. 之初,finalresult都指向['b', 'e', 'g', 'g', 'h']
    2. 之後result += 'a'finalresult都指向['b', 'e', 'g', 'g', 'h', 'a']
    3. 現在輸入elif塊,結果將指向新列表['a'],而final仍指向['b', 'e', 'g', 'g', 'h', 'a']
    4. final永遠不會被這個

    因此後再次更新,你的原代碼(您編輯它之前)可以是固定的,通過改變

    result += letters

    result = result + [letters]

    s = 'azcbobobegghakl' 
    result = [] 
    final = [] 
    for letters in s: 
        result = result + [letters]   
        if result == sorted(result) and len(result) >= len(final): 
         final=result    
        elif result != sorted(result): 
         result = [result[len(result)-1]]   
    
    print(final) 
    
    1

    你有幾個項目來解決。首先是當你使用...

    final = result 
    

    這不只是分配結果中的值到最後。它將變量'final'指向包含'result'也指向的列表的內存地址。那麼如果結果發生變化,最終結果也是如此。要分配的結果,使用...

    final = result[:] 
    

    ,這將給你從開始到結束的一個列表的片段的值。或者您可以使用...

    final = list(result) 
    

    更改後,您需要刪除您的elif語句中的長度比較。

    編輯的代碼:

    s = 'azcbobobegghakl' 
    
    result = [] 
    final = [] 
    
    for letters in s: 
        result += letters 
        if result == sorted(result) and len(result) >= len(final): 
         final = list(result) 
        elif result != sorted(result): 
         result = [result[len(result)-1]] 
    print "".join(final) 
    
    相關問題