簡體   English   中英

做此Python字符串切片的更多pythonic / elegant方法嗎?

[英]More pythonic/elegant way to do this Python string slicing?

所以我有一個函數,它接受兩個字符串輸入-對其進行切片,以使如果長度相等,則前段的長度與后段的長度相同,如果長度為奇數,則中間字符進入前段(即,你好-> 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:]
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
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]])

您還可以將length % 2的結果添加到前面:

def front_back(a, b):
    ln_a, ln_b = len(a), len(b)
    a1 = a2 = ln_a // 2
    b1 = b2 = ln_b // 2
    a1 += ln_a % 2
    b1 += ln_b % 2
    return a[:a1] + b[:b1] + a[-a2:] + b[-b2:]

print(front_back('Kitten', 'Donut'))

這里已經有一些不錯的答案,但是出於多樣性的考慮,由於您似乎對多種可能性感興趣,因此有一種不同的觀察方式:

import itertools

def front_back(a,b):
    words = [a,b]
    output = [[],[]]
    for word in words:
        if len(word) % 2 == 0:
            output[0].append(word[:len(word)//2])
            output[1].append(word[len(word)//2:])

        else:
            output[0].append(word[:len(word)//2+1])
            output[1].append(word[(len(word)//2)+1:])

    return "".join(output[0]) + "".join(output[1])

print(front_back('Kitten', 'Donut'))

用Python解釋3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM