我正在浏览Google提供的免费Python类(Link if interested),而且我坚持参加其中一项练习。
目标: 考虑将字符串分成两半。 如果长度是均匀的,则前半部和后半部的长度相同。 如果长度是奇数,我们会说额外的字符在前半部分。 例如'abcde',前半部分是'abc',后半部分'de'。 给定2个字符串a和b,返回表单的字符串 a-front + b-front + a-back + b-back
这是我到目前为止所做的:
def front_back(a, b):
if len(a)%2 == 0 or len(b)%2 == 0:
firstpart , secondpart = a[:len(a)/2] , a[len(a)/2:]
thirdpart , fourthpart = b[:len(b)/2] , b[len(b)/2:]
else:
firstpart , secondpart = a[:len(a)+1/2] , a[len(a)+1/2:]
thirdpart , fourthpart = b[:len(b)+1/2] , b[len(b)+1/2:]
return firstpart+thirdpart+secondpart+fourthpart
这些是测试字符串:
test(front_back('abcd', 'xy'), 'abxcdy')
test(front_back('abcde', 'xyz'), 'abcxydez')
test(front_back('Kitten', 'Donut'), 'KitDontenut')
每个中的第三个字符串是预期的字符串。
我做错了什么?我知道这个问题不能解释奇长的字符串,但我现在已经搜索了几天而且我没有在网上找到答案。我也对更有效的解决方案持开放态度,但我想知道为什么我的特定设置无法解决,以备将来参考。
谢谢!
答案 0 :(得分:2)
你的问题是你不是将a和b视为单独的案件。考虑a长度为4且b长度为5的情况。在这种情况下,您将始终采用第一个分支,这将错误地处理b。
def front_back(a, b):
if len(a)%2 == 0:
firstpart , secondpart = a[:len(a)/2] , a[len(a)/2:]
else:
firstpart , secondpart = a[:len(a)+1/2] , a[len(a)+1/2:]
if len(b)%2 == 0:
thirdpart , fourthpart = b[:len(b)+1/2] , b[len(b)+1/2:]
else
thirdpart , fourthpart = b[:len(b)/2] , b[len(b)/2:]
return firstpart+thirdpart+secondpart+fourthpart
答案 1 :(得分:2)
您应该将实现拆分为拆分功能和合并。更容易测试这种方式。此外,定义拆分的方式,您可以简化第一个功能:
如果字符串s的长度是偶数,则整数除法中的len(s)//2
与(len(s)+1)//2
相同。如果是奇数,则len(s)//2
比(len(s)+1)//2
小1。由于您需要较长的字符串作为第一部分,因此拆分功能可以写为:
def splitter(s):
mid = (len(s)+1)//2
return s[:mid], s[mid:]
然后进行合并:
def front_back(a,b):
a_front, a_back = splitter(a)
b_front, b_back = splitter(b)
return "".join((a_front, b_front, a_back, b_back))
答案 2 :(得分:1)
尽量避免重复代码..如果你要拆分一个字符串一次,然后按照相同的规则拆分第二个字符串,只需编写一个小函数来完成它!我在主函数splitter()
front_back()
的函数
#!/usr/bin/env python
def front_back(a, b):
def splitter(s):
l = len(s)
if l%2 == 0:
d = l/2
else:
d = (l/2) +1
return (s[:d], s[d:])
a1, a2 = splitter(a)
b1, b2 = splitter(b)
return a1 + b1 + a2 + b2
尝试一下......
答案 3 :(得分:1)
更简单的方法:
def front_back(a, b):
hlena, hlenb = (len(a) + 1)/2, (len(b) + 1)/2
return a[:hlena] + b[:hlenb] + a[hlena:] + b[hlenb:]
不需要if
子句来处理空字符串大小写。切片计算的操作顺序在您的代码中不正确。
提示:在进行编码和编码之前,请在REPL shell中播放问题,直到您对问题进行简洁的表示。初学者面临的最大挑战之一是他们创建的代码比需要的代码大得多,这使得理解和调试变得更加困难。从最小的可加工卡盘开始,然后从那里开始构建。