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)))


完畢。

4 comments:

  1. 不好意思
    我是python的初學者
    請問一下迭代中的
    r =‘ ’
    For c in s:
    c = c + r
    是什麼意思呢

    ReplyDelete
    Replies
    1. 不是c = c + r,而是r = c + r。

      假設s是'abc',
      迴圈第一輪,r會變成'a' + '' 也就是'a',
      迴圈第二輪,r會變成'b' + 'a' 也就是'ba',
      迴圈第二輪,r會變成'c' + 'ba' 也就是'cba',

      達到反轉字串的目的。

      Delete
  2. 非常感謝清楚的說明

    ReplyDelete
  3. Anonymous25/8/20 17:03

    可否幫忙解釋遞迴方式中
    return reverse_r(s[1:]) + s[0] 這條程式碼的意義

    為何在def reverse_r(s)函式定義中可以直接執行reverse_r(s[1:])

    ReplyDelete