Python分长度字符串和结合

我正在浏览Google提供的免费Python类(如果感兴趣,请链接),并且我被困在其中一个练习中。

目标:考虑将字符串分成两半。 如果长度均匀,则前后两半长度相同。 如果长度很奇怪,我们会说额外的字符在前半部分。 例如'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')

每个中的第三个字符串是预期的字符串。

我究竟做错了什么? 我知道这个问题无法解释奇数字符串,但我一直在寻找几天,并且我没有在网上找到答案。 我也接受更有效的解决方案,但我想知道为什么我的特定设置不能解决,以备将来参考。

谢谢!


更简单的方法:

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中处理问题,直到您对问题有一个简洁的表示。 初学者面临的最大挑战之一是他们创建的代码比需要的代码大得多,这使得难以理解和调试。 从最小的可用夹头开始,并从那里建造。


你的问题是你不把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

您应该将实现拆分为拆分函数和合并。 更容易测试这种方式。 此外,分割的定义方式,可以简化第一个功能:

如果字符串s的长度是偶数, len(s)//2的整数除法与(len(s)+1)//2 。 如果它是奇数,则len(s)//2小于(len(s)+1)//2 。 由于您需要较长的字符串作为第一部分,分割函数可以写为:

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))
链接地址: http://www.djcxy.com/p/26781.html

上一篇: Python divide odd length string and combine

下一篇: Boolean operators && and