更多pythonic /优雅方式来做这个Python字符串切片?

Spi*_*uce 1 python string lambda

所以我有一个带两个字符串输入的函数 - 它将它们切片,这样如果长度均匀,则前段的长度与后面的长度相同,如果是奇数长度,则中间字符前置到前段(即你好 - > 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
Run Code Online (Sandbox Code Playgroud)

有更多的pythonic /优雅方式吗?

我无法弄清楚如何使用lambdas(他们无法处理if处理偶数和奇数长度情况所必需的声明......我想?)如果这是要走的路......

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

当我尝试使用lamdbas的版本时,基于一个建议(对于练习),我得到一个没有定义全局名称's'的NameError.我怎么写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")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

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

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
Run Code Online (Sandbox Code Playgroud)

通过在除以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
Run Code Online (Sandbox Code Playgroud)

你甚至可以内联切片:

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:]
Run Code Online (Sandbox Code Playgroud)


Dle*_*eep 6

def divideString(myString):
    sliceHere = ( (1 + len(myString)) // 2)
    return myString[:sliceHere], myString[sliceHere:]

def front_back(a, b):
    a1, a2 = divideString(a)
    b1, b2 = divideString(b)
    return a1 + b1 + a2 + b2
Run Code Online (Sandbox Code Playgroud)

  • @SpicyClubSauce:这是一个愚蠢的限制.将代码放在一个函数中避免了重复,并给出了一个名称.但是如果你必须在一个函数中拥有它,你可以移动`front_back`里面的函数定义*.如果你不想要一个`def`你可以把它变成一个'lambda`.像这样:`divideString = lambda s:s [:((1 + len(s))// 2)],s [((1 + len(s))// 2):]` (2认同)