Trong Python, một chuỗi là một chuỗi các ký tự Unicode. Mặc dù Python hỗ trợ nhiều chức năng để thao tác chuỗi, nhưng nó không có chức năng hoặc phương pháp sẵn có được thiết kế rõ ràng để đảo ngược chuỗi.

>>> 'hocdevops'.reverse()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'str' object has no attribute 'reverse'

Đảo ngược chuỗi không phải là một hoạt động phổ biến trong lập trình và thường được sử dụng trong các cuộc phỏng vấn.

Bài viết này đi qua nhiều cách khác nhau để đảo ngược một chuỗi trong Python.

Sử dụng String Slice

Hiểu cách lập chỉ mục hoạt động trong Python là rất quan trọng để thực hiện thao tác String Slice. Nói chung, số Chỉ mục được sử dụng để truy cập các ký tự cụ thể trong một chuỗi.

Có hai loại lập chỉ mục; chỉ số dương và âm.

Bạn có thể truy cập ký tự , thông qua số chỉ số dương hoặc thông qua số chỉ số âm là:

>>> print('hocdevops'[2])

Output:

c
>>> print('hocdevops'[-6])

Output:

c

Chúng ta có thể gọi ra một loạt các kí tự từ một chuỗi thông qua một kỹ thuật cắt. Cắt là hoạt động trích xuất chuỗi của một phần tử con từ chuỗi nhất định.

Cú pháp Slice:

string[start:stop:step]
  • Đối số đầu tiên chỉ định chỉ mục mà tại đó khai thác bắt đầu. Khi một chỉ mục âm được sử dụng, nó cho biết một sự bù đắp từ cuối chuỗi. Nếu đối số này bị bỏ qua, việc cắt bắt đầu từ chỉ mục 0.
  • Đối số thứ hai chỉ định chỉ mục trước đó để kết thúc khai thác; Kết quả không bao gồm element. Khi một chỉ mục âm được sử dụng, nó cho biết một sự bù đắp từ cuối chuỗi. Nếu đối số này bị bỏ qua hoặc lớn hơn chiều dài của chuỗi, việc cắt đi đến cuối chuỗi.
  • Đối số thứ ba là tùy chọn và chỉ định bước cắt. Khi đối số không được sử dụng, nó mặc định là 1. Khi một giá trị âm được sử dụng, lát lấy các yếu tố theo thứ tự ngược lại.

Kết quả của việc cắt một chuỗi là một chuỗi mới chứa các yếu tố được chiết xuất và chuỗi ban đầu không được sửa đổi.

Để đảo ngược một chuỗi bằng cách sử dụng cắt, ta bỏ qua và đối số và sử dụng một bước tăng âm.

Bước tăng âm của có nghĩa là việc cắt bắt đầu ở phần tử cuối cùng và kết thúc ở phần tử đầu tiên, dẫn đến một chuỗi đảo ngược.

>>> print('hocdevops'[::-1])

Output:

spovedcoh

Bạn cũng có thể xác định một hàm tùy chỉnh và sử dụng nó để đảo ngược chuỗi:

def rev_str_thru_slicing(str_):
    return str_[::-1]

INPUT_STRING = "hocdevops"

if __name__ == '__main__':
    print("INPUT STRING -", INPUT_STRING)
    print("REVERSED STRING -", rev_str_thru_slicing(INPUT_STRING))

Output

Input String - hocdevops
Reversed String using Slicing - spovedcoh

Sử dụng Hàm reversed()

Chức năng tích hợp xử lý các mục chuỗi theo thứ tự ngược lại và trả về bộ lặp ngược đã đảo ngược.

Trong ví dụ dưới đây, các phần tử của bộ lặp lại đảo ngược được thêm vào một chuỗi trống bằng cách sử dụng toán tử join:

def rev_str_thru_join_revd(STR):
    return "".join(reversed(STR))  

INPUT_STRING = "hocdevops" 

if __name__ == '__main__':

    print("INPUT STRING -", INPUT_STRING)
    print("RESERVED STRING THROUGH JOIN & REVERSED", rev_str_thru_join_revd(INPUT_STRING))

Output:

Input String - hocdevops
Reserved String Through Join & Reserved Methods - spovedcoh

Sử dụng List reverse()

Để đảo ngược một chuỗi với phương pháp List;trước tiên, chuỗi cần được chuyển đổi thành một danh sách bằng cách sử dụng trình xây dựng. Sau đó, các mục danh sách được đảo ngược tại chỗ với phương pháp và cuối cùng, các mục danh sách được nối thành một chuỗi bằng cách sử dụng phương pháp.reverse()listreverse()join()

Đây là một ví dụ:

def rev_str_thru_list_reverse(STR):
    lst = list(STR)
    lst.reverse()
    return(''.join(lst))
 
INPUT_STRING = "hocdevops"
 
if __name__ == '__main__':
    print("Input String -", INPUT_STRING)

print("Reserved String Through List", rev_str_thru_list_reverse(INPUT_STRING))

Bản sao

Input String - hocdevops
Reserved String Through List Reverse Method - spovedcoh

Sử dụng hàm Đệ quy

Trong Python, một hàm đệ quy là một hàm tự gọi cho đến khi một số điều kiện được đáp ứng.

Trong đoạn mã bên dưới, hàm tự gọi cho đến khi chiều dài chuỗi lớn hơn 0. Trong mỗi cuộc gọi, chuỗi được cắt, chỉ để lại ký tự đầu tiên. Sau đó, nó được kết hợp với các kí tự bị cắt.

def rev_str_thru_recursion(STR):
    if len(STR) == 0:
         return STR
    else:
        return rev_str_thru_recursion(STR[1:]) + STR[0]

INPUT_STRING = "hocdevops"

if __name__ == '__main__':
    print("INPUT STRING -", INPUT_STRING)

print("RESERVED STRING THROUGH RECURSION", rev_str_thru_recursion(INPUT_STRING))

Phân tích so sánh

Trong phần này, chúng ta sẽ thực hiện một so sánh đơn giản giữa bốn phương pháp được xác định này để xác định hiệu quả của chúng. Chúng ta sẽ phân tích hiệu suất bằng cách sử dụng một mô-đun Python được gọi là “timeit”. Nó cung cấp thời gian thực hiện các đoạn mã. Tùy chọn “lặp lại” của mô-đun “timeit” giúp lặp lại việc thực thi mã một triệu lần. Chúng ta có thể hiểu đầu ra như một thời gian trung bình bằng cách thực hiện đoạn mã một triệu lần.

Phương phápThời gian thực hiệnTỷ lệ so sánh Calc.
Slicing0.231x
List Reverse1.637x
Join & Reserved1.737,5x
Đệ quy19.1983x

Bảng trên cho thấy phương pháp cắt nhanh hơn bảy lần so với cách tiếp cận List Reverse, nhanh hơn 7,5 lần so với cách tiếp cận Join & Reserved và nhanh hơn 83 lần so với phương pháp đệ quy. Vì vậy, cắt là cách nhanh nhất và tốt nhất để đảo ngược chuỗi.

Các kết quả trên là phân tích so sánh các phương pháp được thảo luận để đảo ngược chuỗi trong cùng một môi trường. Các con số có thể khác nhau trong các môi trường máy tính khác nhau, nhưng tỷ lệ có thể sẽ vẫn giữ nguyên.

if __name__ == "__main__":

    ## Performance Calculation

    import timeit
    from statistics import mean

    s = INPUT_STRING * 10
    repeatCount = 100

    SLICING_PERF = timeit.repeat(lambda: rev_str_thru_slicing(s), repeat=repeatCount)
    print(min(SLICING_PERF), mean(SLICING_PERF), max(SLICING_PERF), SLICING_PERF)

    J_R_PERF = timeit.repeat(lambda: rev_str_thru_join_revd(s), repeat=repeatCount)
    print(min(J_R_PERF), mean(J_R_PERF), max(J_R_PERF), J_R_PERF)

    LIST_PERF = timeit.repeat(lambda: rev_str_thru_list_reverse(s), repeat=repeatCount)
    print(min(LIST_PERF), mean(LIST_PERF), max(LIST_PERF), LIST_PERF)

    RECUR_PERF = timeit.repeat(lambda: rev_str_thru_recursion(s), repeat=repeatCount)
    print(min(RECUR_PERF), mean(RECUR_PERF), max(RECUR_PERF), RECUR_PERF)

Kết thúc

Python không có bất kỳ function tích hợp nào để đảo ngược chuỗi, nhưng chúng ta có thể sử dụng các phương pháp khác để đảo ngược chuỗi. Phân tích thử nghiệm hồi quy cho thấy phương pháp cắt là cách nhanh nhất để đảo ngược một chuỗi.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments