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 :(得分: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 = 0
或s1
为空字符串,则s2
是必需的。如果发生这种情况,则不会输入for
循环,因此i
不会获得分配值。
最后,这是一个使用列表理解和标准itertools.zip_longest
函数的紧凑版本。
def interleave(s1, s2):
return ''.join([u+v for u,v in zip_longest(s1, s2, fillvalue='')])