Tìm hiểu làm thế nào để đảo ngược một chuỗi trong Python.
Không có chức năng tích hợp để đảo ngược một chuỗi trong Python.
Cách nhanh nhất [và dễ nhất?] Là sử dụng một lát cắt lùi, -1
.
Thí dụ
Đảo ngược chuỗi "Hello World":
txt = "Hello World" [::-1] in [txt]
print[txt]
Hãy tự mình thử »
Ví dụ giải thích
Chúng tôi có một chuỗi, "Hello World", mà chúng tôi muốn đảo ngược:
Chuỗi để đảo ngược
txt = "Hello World" [::-1] in [txt]"Hello World"[::-1]
print[txt]
Tạo một lát bắt đầu ở cuối chuỗi và di chuyển về phía sau.
Trong ví dụ cụ thể này, câu lệnh SLICE [::-1]
có nghĩa là bắt đầu ở cuối chuỗi và kết thúc ở vị trí 0, di chuyển với bước -1
, tiêu cực, có nghĩa là một bước lùi.
Lát chuỗi
txt = "Hello World" [::-1] in [txt][::-1]
print[txt]
Tạo một lát bắt đầu ở cuối chuỗi và di chuyển về phía sau.
Trong ví dụ cụ thể này, câu lệnh SLICE [::-1]
có nghĩa là bắt đầu ở cuối chuỗi và kết thúc ở vị trí 0, di chuyển với bước -1
, tiêu cực, có nghĩa là một bước lùi.
Lát chuỗi
Bây giờ chúng ta có một chuỗi
1 có nội dung "Xin chào thế giới" ngược.list_comprehension : min: 4.2μs, mean: 4.5μs, max: 31.7μs
reverse_func : min: 75.4μs, mean: 76.6μs, max: 109.5μs
reverse_reduce : min: 749.2μs, mean: 882.4μs, max: 2310.4μs
reverse_loop : min: 469.7μs, mean: 577.2μs, max: 1227.6μs
print[txt]
In chuỗi để chứng minh kết quả
In danh sách
Thí dụ
Đảo ngược chuỗi "Hello World":
return x[::-1]
txt = "Hello World" [::-1] in [txt]
Hãy tự mình thử »
Hãy tự mình thử »
Ví dụ giải thích
Chúng tôi có một chuỗi, "Hello World", mà chúng tôi muốn đảo ngược:
In chuỗi để chứng minh kết quả
In danh sách
return x[::-1]
txt = "Hello World" [::-1] in [txt]
Hãy tự mình thử »
Ví dụ giải thích
Lát chuỗi
In danh sách
return x[::-1]
txt = "Hello World" [::-1] in [txt]
Hãy tự mình thử »
Ví dụ giải thích
Chúng tôi có một chuỗi, "Hello World", mà chúng tôi muốn đảo ngược:
In danh sách
return x[::-1]
txt = "Hello World" [::-1] in [txt]
Hãy tự mình thử »
Ví dụ giải thích
Chúng tôi có một chuỗi, "Hello World", mà chúng tôi muốn đảo ngược:
Chuỗi để đảo ngược
return x[::-1]mytxt = my_function["I wonder how this text looks like
backwards"]print[mytxt]
txt = "Hello World" [::-1] in [txt]
Tạo một lát bắt đầu ở cuối chuỗi và di chuyển về phía sau.
In danh sách
return x[::-1]
txt = "Hello World" [::-1] in [txt]
print[mytxt]Câu trả lời này dài hơn một chút và chứa 3 phần: điểm chuẩn của các giải pháp hiện có, tại sao hầu hết các giải pháp ở đây đều sai, giải pháp của tôi.Benchmarks of existing solutions, why most solutions here are wrong, my solution.
Các câu trả lời hiện có chỉ chính xác nếu các bộ điều chỉnh / cụm đồ họa Unicode bị bỏ qua. Tôi sẽ giải quyết điều đó sau, nhưng trước tiên hãy xem xét tốc độ của một số thuật toán đảo ngược:
list_comprehension : min: 0.6μs, mean: 0.6μs, max: 2.2μs
reverse_func : min: 1.9μs, mean: 2.0μs, max: 7.9μs
reverse_reduce : min: 5.7μs, mean: 5.9μs, max: 10.2μs
reverse_loop : min: 3.0μs, mean: 3.1μs, max: 6.8μs
list_comprehension : min: 4.2μs, mean: 4.5μs, max: 31.7μs
reverse_func : min: 75.4μs, mean: 76.6μs, max: 109.5μs
reverse_reduce : min: 749.2μs, mean: 882.4μs, max: 2310.4μs
reverse_loop : min: 469.7μs, mean: 577.2μs, max: 1227.6μs
Bạn có thể thấy rằng thời gian để hiểu danh sách [
list_comprehension : min: 4.2μs, mean: 4.5μs, max: 31.7μs
reverse_func : min: 75.4μs, mean: 76.6μs, max: 109.5μs
reverse_reduce : min: 749.2μs, mean: 882.4μs, max: 2310.4μs
reverse_loop : min: 469.7μs, mean: 577.2μs, max: 1227.6μs
2] trong mọi trường hợp cho đến nay thấp nhất [ngay cả sau khi sửa lỗi đánh máy của tôi].Chuỗi đảo ngược
Nếu bạn thực sự muốn đảo ngược một chuỗi theo lẽ thường, nó sẽ phức tạp hơn. Ví dụ, lấy chuỗi sau [ngón tay màu nâu chỉ bên trái, ngón tay màu vàng chỉ lên]. Đó là hai biểu đồ, nhưng 3 điểm mã Unicode. Một cái bổ sung là một công cụ sửa đổi da.
example = "👈🏾👆"
Nhưng nếu bạn đảo ngược nó với bất kỳ phương pháp đã cho, bạn có được ngón tay màu nâu hướng lên, ngón tay màu vàng hướng sang trái. Lý do cho điều này là công cụ sửa đổi màu "nâu" vẫn ở giữa và được áp dụng cho bất cứ điều gì trước đó. Vì vậy chúng tôi có
- U: ngón tay chỉ lên
- M: Công cụ sửa đổi màu nâu
- L: ngón tay chỉ trái
và
original: LMU 👈🏾👆
reversed: UML [above solutions] ☝🏾👈
reversed: ULM [correct reversal] 👆👈🏾
Các cụm đồ họa Unicode phức tạp hơn một chút so với chỉ các điểm mã sửa đổi. May mắn thay, có một thư viện để xử lý đồ thị:
>>> import grapheme
>>> g = grapheme.graphemes["👈🏾👆"]
>>> list[g]
['👈🏾', '👆']
và do đó câu trả lời đúng sẽ là
def reverse_graphemes[string]:
g = list[grapheme.graphemes[string]]
return ''.join[g[::-1]]
đó cũng là chậm nhất:
list_comprehension : min: 0.5μs, mean: 0.5μs, max: 2.1μs
reverse_func : min: 68.9μs, mean: 70.3μs, max: 111.4μs
reverse_reduce : min: 742.7μs, mean: 810.1μs, max: 1821.9μs
reverse_loop : min: 513.7μs, mean: 552.6μs, max: 1125.8μs
reverse_graphemes : min: 3882.4μs, mean: 4130.9μs, max: 6416.2μs
Mật mã
#!/usr/bin/env python
import numpy as np
import random
import timeit
from functools import reduce
random.seed[0]
def main[]:
longstring = ''.join[random.choices["ABCDEFGHIJKLM", k=2000]]
functions = [[list_comprehension, 'list_comprehension', longstring],
[reverse_func, 'reverse_func', longstring],
[reverse_reduce, 'reverse_reduce', longstring],
[reverse_loop, 'reverse_loop', longstring]
]
duration_list = {}
for func, name, params in functions:
durations = timeit.repeat[lambda: func[params], repeat=100, number=3]
duration_list[name] = list[np.array[durations] * 1000]
print['{func: