断言错误,尽管我的返回值是相同的

时间:2016-09-25 10:25:04

标签: python

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()

2 个答案:

答案 0 :(得分:1)

您正在混淆interleave()从其返回的内容所打印的内容。断言正在测试返回的值。例如,当s1和s2的长度相同时,您的代码会打印交错(在print((m),end="")行上),但会返回一个空字符串(在行return ("")

如果你想让interleave返回交错的字符串,你需要收集x和y变量(如果它们总是保持字符,则不是很好地命名)到一个字符串中并返回它。

答案 1 :(得分: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 = 0s1为空字符串,则s2是必需的。如果发生这种情况,则不会输入for循环,因此i不会获得分配值。

最后,这是一个使用列表理解和标准itertools.zip_longest函数的紧凑版本。

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