字串反轉分逐字元與逐詞兩種語意。Python 提供切片、reversed、split/join、正則等多種工具,各有優劣。
s = 'abcd'
rev = s[::-1]
print(rev) # 'dcba'
rev = ''.join(reversed(s))
print(rev) # 'dcba'
# reversed 回傳迭代器,可直接迴圈
for c in reversed(s):
print(c, end='') # d c b a
import timeit
s = 'a' * 10000
print('slice:', timeit.timeit('s[::-1]', globals=globals()))
print('reversed:', timeit.timeit('"".join(reversed(s))', globals=globals()))
# 切片通常快 2-3x
s = 'Today is really a good day'
words = s.split() # ['Today', 'is', 'really', 'a', 'good', 'day']
words.reverse() # 就地反轉
print(' '.join(words)) # 'day good a really is Today'
# 一行版
print(' '.join(s.split()[::-1]))
print(' '.join(reversed(s.split())))
import re
s = 'Today is really a good day' # 多重空白
# 分割並保留分隔符
parts = re.split(r'(\s+)', s)
print(parts)
# ['Today', ' ', 'is', ' ', 'really', ' ', 'a', ' ', 'good', ' ', 'day']
parts.reverse()
print(''.join(parts))
# 'day good a really is Today' (空白模式完整保留)
rev = ''.join(reversed(re.split(r'(\s+)', s)))
import regex # pip install regex
s = 'e\u0301\u0302' # e + 重音 + 迴音 (3 代碼點,1 字素)
print(''.join(reversed(s))) # 錯誤順序:迴音+重音+e
print(''.join(regex.findall(r'\X', s)[::-1])) # 正確:單字素反轉
| 需求 | 推薦方法 | 備註 |
|---|---|---|
| 逐字元、效能優先 | s[::-1] | C 層實現,最快 |
| 逐字元、語意明確/串接管線 | ''.join(reversed(s)) | 可直接餵給迴圈 |
| 逐詞、單一空白分隔 | ' '.join(reversed(s.split())) | 標準做法 |
| 逐詞、保留原始空白/分隔符 | ''.join(reversed(re.split(r'(\s+)', s))) | 捕獲組關鍵 |
| 含合成字元 (emoji、重音) | regex.findall(r'\X', s)[::-1] | 需安裝 regex |
理解語意差異,選對工具,字串反轉不再是面試題陷阱。