Skip to main content
 首页 » 编程设计

python之执行此 Python 字符串切片的更多 pythonic/优雅方法

2025年05月04日12Renyi-Fan

所以我有一个接受两个字符串输入的函数 - 它对它们进行切片,如果长度为偶数,则前段的长度与后面的长度相同,如果长度为奇数,则中间字符转到前段(即 hello -> hel , lo)。然后混合并匹配两个字符串的前后片段以产生最终输出。

我希望能够在一个函数下完成这一切,但我想出的东西实在是太丑陋了:

def front_back(a, b): 
    if len(a) % 2 == 0: 
        front_a = a[:len(a)/2] 
        back_a = a[len(a)/2:] 
    elif len(a) % 2 != 0: 
        front_a = a[:(len(a)/2)+1] 
        back_a = a[(len(a)/2)+1:] 
    if len(b) % 2 == 0: 
        front_b = b[:len(b)/2] 
        back_b = b[len(b)/2:] 
    elif len(b) % 2 != 0: 
        front_b = b[:(len(b)/2)+1] 
        back_b = b[(len(b)/2)+1:] 
 
    print front_a + front_b + back_a + back_b 
 
front_back('Kitten', 'Donut') ---> KitDontenut 

有没有更pythonic/优雅的方式?

我想不出如何使用 lambda(它们无法处理处理偶数和奇数长度情况所必需的 if 语句……我想?)如果那样的话去...

更新: 感谢大家的好建议。还有一个问题:

当我根据建议(练习)尝试使用 lamdbas 的版本时,我收到一个 NameError,指出全局名称“s”未定义。我编写 lambda 的方式有什么问题?

def front_back(a, b): 
    divideString = lambda s: s[:((1+len(s))//2)], s[((1+len(s))//2):] 
    a1, a2 = divideString(a) 
    b1, b2 = divideString(b) 
    print a1 + b1 + a2 + b2 
front_back("hello","cookies") 

请您参考如下方法:

你让它变得比需要的更复杂:

def front_back(a, b): 
    mid_a, mid_b = (len(a) + 1) // 2, (len(b) + 1) // 2 
    front_a, back_a = a[:mid_a], a[mid_a:] 
    front_b, back_b = b[:mid_b], b[mid_b:] 
    print front_a + front_b + back_a + back_b 

在除以 2(底除法)之前加 1,您向上。

演示:

>>> def front_back(a, b): 
...     mid_a, mid_b = (len(a) + 1) // 2, (len(b) + 1) // 2 
...     front_a, back_a = a[:mid_a], a[mid_a:] 
...     front_b, back_b = b[:mid_b], b[mid_b:] 
...     print front_a + front_b + back_a + back_b 
...  
>>> front_back('Kitten', 'Donut') 
KitDontenut 

您甚至可以内联切片:

def front_back(a, b): 
    mid_a, mid_b = (len(a) + 1) // 2, (len(b) + 1) // 2 
    print a[:mid_a] + b[:mid_b] + a[mid_a:] + b[mid_b:]