2015/04/13

Python筆記:反轉字串

假設有個字串,
s = 'Hello Python'

想要反轉,也就是想要得到'nohtyP olleH',但型別str並無提供方法reverse,
# s.reverse()

不過還好,輕輕鬆鬆便能以切片(slice)解決,
print(s[::-1])

或者麻煩一點,先呼叫reversed進行反轉,會得到含有單一字元的串列(list),再以字串的join結合,
print(''.join(reversed(s)))

萬一不行使用上述作法時,自己動手吧,先以迭代方式,迭代每個字元,一個個接起來,
def reverse_i(s):
    r = ''
    for c in s:
            r = c + r
    return r
print(reverse_i(s))

再試試遞迴方式,
def reverse_r(s):
    if len(s) <= 1:
            return s
    else:
            return reverse_r(s[1:]) + s[0]
print(reverse_r(s))

要不然,先轉成串列(list),串列就有方法reverse可呼叫了,
r = list(s)
r.reverse()
print(''.join(r))

什麼,不能呼叫reverse嗎?那就自己動手囉,
def reverse_li(s):
    r = []
    for c in s:
        r.insert(0, c)
    return ''.join(r)
print(reverse_li(s))

也可把上述動作壓縮成一行,
print(''.join([s[i] for i in range(len(s)-1, -1, -1)]))

把串列生成式(list comprehension)改成產生器運算式(generator expression),
print(''.join(s[i] for i in range(len(s)-1, -1, -1)))

或者自己寫產生器函式(generator function),
def reverse_g(s):
    def sub(s):
        for i in range(len(s)-1, -1, -1):
            yield s[i]
    return ''.join(sub(s))
print(reverse_g(s))

再不然,運用其他的容器型別,
from collections import deque
r = deque(s)
r.reverse()
print(''.join(r))

說來說去,最便捷的方法還是開頭就已介紹的,
print(s[::-1])
print(''.join(reversed(s)))


完畢。

No comments:

Post a Comment