Đảo ngược chuỗi là một trong những thao tác cơ bản nhưng hữu ích trong lập trình Python.
Bài viết này sẽ giới thiệu 5 cách đảo ngược chuỗi trong Python từ đơn giản đến tối ưu, giúp bạn dễ dàng áp dụng trong thực tế.
1. Cách đảo ngược chuỗi trong Python?
Một số cách đảo ngược chuỗi phổ biến như sau:
- Dùng slicing để tạo bản sao đảo ngược của chuỗi
- Dùng vòng lặp
for
và nối các ký tự theo thứ tự ngược - Dùng vòng lặp
while
để duyệt ký tự chuỗi theo thứ tự ngược và nối chúng - Dùng hàm
join()
của chuỗi kết hợp với iteratorreversed()
- Tạo list từ chuỗi rồi gọi hàm
reverse()
của list - Dùng đệ quy
1.1) Đảo ngược chuỗi Python bằng Slicing
def reverse_slicing(s):
return s[::-1]
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using slicing =', reverse_slicing(input_str))
Khi chạy đoạn script Python trên, đầu ra sẽ là:
Reverse String using slicing = FE∂çBA
1.2) Đảo ngược chuỗi bằng For Loop
def reverse_for_loop(s):
s1 = ''
for c in s:
s1 = c + s1 # appending chars in reverse order
return s1
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using for loop =', reverse_for_loop(input_str))
Đầu ra: Reverse String using for loop = FE∂çBA
1.3) Đảo ngược chuỗi bằng While Loop
def reverse_while_loop(s):
s1 = ''
length = len(s) - 1
while length >= 0:
s1 = s1 + s[length]
length = length - 1
return s1
input_str = 'ABç∂EF'
if __name__ == "__main__":
print('Reverse String using while loop =', reverse_while_loop(input_str))
1.4) Đảo ngược chuỗi bằng join() và reversed()
def reverse_join_reversed_iter(s):
s1 = ''.join(reversed(s))
return s1
1.5) Đảo ngược chuỗi Python bằng List reverse()
def reverse_list(s):
temp_list = list(s)
temp_list.reverse()
return ''.join(temp_list)
1.6) Đảo ngược chuỗi Python bằng Đệ quy
def reverse_recursion(s):
if len(s) == 0:
return s
else:
return reverse_recursion(s[1:]) + s[0]
2. Cách tốt nhất để đảo ngược chuỗi trong Python
Có nhiều thuật toán để đảo ngược chuỗi, trong đó 6 cách đã được giới thiệu ở trên. Để xác định phương pháp tối ưu, chúng ta có thể dùng module timeit
chạy lặp lại các hàm này nhiều lần và lấy thời gian trung bình để đánh giá.
Tất cả các hàm trên được lưu trong script Python có tên string_reverse.py
. Mỗi hàm được chạy 100.000 lần bằng module timeit
và lấy trung bình của 5 lần chạy nhanh nhất.
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_slicing("ABç∂EF"*10)'
100000 loops, best of 5: 0.449 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_list("ABç∂EF"*10)'
100000 loops, best of 5: 2.46 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_join_reversed_iter("ABç∂EF"*10)'
100000 loops, best of 5: 2.49 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_for_loop("ABç∂EF"*10)'
100000 loops, best of 5: 5.5 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_while_loop("ABç∂EF"*10)'
100000 loops, best of 5: 9.4 usec per loop
$ python3.7 -m timeit --number 100000 --unit usec 'import string_reverse' 'string_reverse.reverse_recursion("ABç∂EF"*10)'
100000 loops, best of 5: 24.3 usec per loop
Bảng dưới đây trình bày kết quả và mức độ chậm của từng thuật toán so với phương pháp nhanh nhất.
Thuật toán | Thời gian thực thi (Best of 5) | Độ chậm |
---|---|---|
Slicing | 0.449 usec | 1x |
List reverse() | 2.46 usec | 5.48x |
reversed() + join() | 2.49 usec | 5.55x |
for loop | 5.5 usec | 12.25x |
while loop | 9.4 usec | 20.94x |
Recursion | 24.3 usec | 54.12x |
3. Tóm tắt
Chúng ta nên dùng slicing để đảo ngược chuỗi trong Python. Cú pháp rất ngắn gọn, không cần tự viết logic xử lý. Ngoài ra, đây cũng là cách nhanh nhất trong kết quả kiểm thử trên.
Bạn có thể xem toàn bộ script Python và thêm ví dụ khác trên GitHub Repository của chúng tôi.
4. Tham khảo
- Tài liệu API
reversed()
- Tài liệu API
str.join()