2016-09-25 52 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