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

2024-04-19 08:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个函数,它接受两个字符串输入-它将它们切分,这样如果长度为偶数,则前面部分的长度与后面部分的长度相同,如果长度为奇数,则中间字符将转到前面部分(即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

有没有一种更优雅的方式?你知道吗

我不知道如何使用lambda(它们不能处理处理偶数和奇数长度情况所必需的if语句。。。我想?)如果是这样的话。。。你知道吗

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

当我尝试使用lamdbas的一个版本时,基于一个建议(为了实践),我得到了一个没有定义全局名称的nameberror。我写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")

Tags: lambda函数字符串hellolenifdefback
3条回答

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

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:]
def front_back(a, b):
    return "".join([a[:(len(a)+1)/2]], b[:(len(b)+1)/2], \
        a[(len(a)+1)/2]:], b[:(len(b)+1)/2]])
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

相关问题 更多 >