假設有個字串,
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)))
完畢。
2015/04/13
Python筆記:反轉字串
Subscribe to:
Post Comments (Atom)
不好意思
ReplyDelete我是python的初學者
請問一下迭代中的
r =‘ ’
For c in s:
c = c + r
是什麼意思呢
不是c = c + r,而是r = c + r。
Delete假設s是'abc',
迴圈第一輪,r會變成'a' + '' 也就是'a',
迴圈第二輪,r會變成'b' + 'a' 也就是'ba',
迴圈第二輪,r會變成'c' + 'ba' 也就是'cba',
達到反轉字串的目的。
非常感謝清楚的說明
ReplyDelete可否幫忙解釋遞迴方式中
ReplyDeletereturn reverse_r(s[1:]) + s[0] 這條程式碼的意義
為何在def reverse_r(s)函式定義中可以直接執行reverse_r(s[1:])