2016-09-25 34 views
-1
def interleave(s1,s2): #This function interleaves s1,s2 together 
    guess = 0 
    total = 0 
    while (guess < len(s1)) and (guess < len(s2)): 
     x = s1[guess] 
     y = s2[guess] 
     m = x + y 
     print ((m),end ="") 
     guess += 1 
    if (len(s1) == len(s2)): 
     return ("") 
    elif(len(s1) > len(s2)): 
     return (s1[guess:]) 
    elif(len(s2) > len(s1)): 
     return (s2[guess:]) 

print (interleave("Smlksgeneg n a!", "a ie re gsadhm")) 

由於某種原因,我的測試函數提供了斷言錯誤事件,儘管輸出與下面的代碼相同。 例如 - 「Smlksgeneg n a!」,「a ie re gsadhm」返回「Sam喜歡綠色雞蛋和火腿!」 但斷言錯誤仍然(),從什麼是它返回出來斷言錯誤,儘管我的返回值相同

def testInterleave(): 
    print("Testing interleave()...", end="") 
    assert(interleave("abcdefg", "abcdefg")) == ("aabbccddeeffgg") 
    assert(interleave("abcde", "abcdefgh") == "aabbccddeefgh") 
    assert(interleave("abcdefgh","abcde") == "aabbccddeefgh") 
    assert(interleave("Smlksgeneg n a!", "a ie re gsadhm") == 
        "Sam likes green eggs and ham!") 
    assert(interleave("","") == "") 
    print("Passed!") 

testInterleave() 
+0

s1和s2的哪些值會導致斷言錯誤?什麼是確切的錯誤和追溯?當代碼中沒有聲明語句時,如何得到斷言錯誤? –

+0

如果其中一個答案解決了您的問題,您應該接受它(點擊相應答案旁邊的複選標記)。這有兩件事。它讓每個人都知道你的問題已經得到解決,讓你滿意,並且它可以幫助你幫助你。請參閱[此處](http://meta.stackexchange.com/a/5235)以獲取完整說明。 –

回答

1

你混淆了什麼是交錯打印。 assert正在測試返回的值。例如,當s1和s2的長度相同時,您的代碼會打印交織(在print((m),end="")一行),但會返回一個空字符串(在行return ("")

如果要交織以返回交織字符串,則需要收集x和y變量(如果它們始終保持字符,則不會很好地命名)並返回。

0

問題是,您的函數僅打印結果字符串的交叉部分,它不會返回它,它只返回較長字符串的尾部。

這裏是你的代碼的修復和簡化版本,你不需要那樣做if... elif測試。此外,你的代碼有很多多餘的括號(和一個錯位的括號),我已經刪除了。

def interleave(s1, s2): 
    ''' Interleave strings s1 and s2 ''' 
    guess = 0 
    result = "" 
    while (guess < len(s1)) and (guess < len(s2)): 
     x = s1[guess] 
     y = s2[guess] 
     result += x + y 
     guess += 1 
    return result + s1[guess:] + s2[guess:] 

def testInterleave(): 
    print("Testing interleave()...", end="") 
    assert interleave("abcdefg", "abcdefg") == "aabbccddeeffgg" 
    assert interleave("abcde", "abcdefgh") == "aabbccddeefgh" 
    assert interleave("abcdefgh","abcde") == "aabbccddeefgh" 
    assert (interleave("Smlksgeneg n a!", "a ie re gsadhm") 
     == "Sam likes green eggs and ham!") 
    assert interleave("", "") == "" 
    print("Passed!") 

print(interleave("Smlksgeneg n a!", "a ie re gsadhm")) 

testInterleave() 

輸出

Sam likes green eggs and ham! 
Testing interleave()...Passed! 

這裏是interleave略微改進版。它使用一個列表來存儲結果,而不是使用重複的字符串連接。使用列表來構建像這樣的字符串是一種常見的Python實踐,因爲它比使用++=的重複字符串連接更有效; OTOH,++=在字符串上進行了優化,以便它們對於短字符串(高達1000個字符左右)非常有效。

def interleave(s1, s2): 
    result = [] 
    i = 0 
    for i, t in enumerate(zip(s1, s2)): 
     result.extend(t) 
    i += 1 
    result.extend(s1[i:] + s2[i:]) 
    return ''.join(result) 

i = 0是在必要的情況下或者s1s2是空字符串。當發生這種情況時,不會輸入for循環,因此i將不會被賦值。

最後,這是一個使用列表理解和標準itertools.zip_longest函數的緊湊版本。

def interleave(s1, s2): 
    return ''.join([u+v for u,v in zip_longest(s1, s2, fillvalue='')]) 
+0

非常感謝大家!最近開始自學學習編程,我很感激幫助 – Joel