Reading Time: 3 minutes

Đả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ế.

đảo ngược chuỗi trong Python

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 iterator reversed()
  • 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

Python

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

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất