Thực sự không có gì sai với mã của bạn cả. Nó hoạt động, rõ ràng lý do tại sao nó hoạt động, thật khó để hiểu sai hoặc hiểu lầm.
Vâng, bạn có thể làm cho nó nhanh hơn, nhưng chỉ bởi một yếu tố không đổi. . Cũng sẽ là
In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
0.] Và với chi phí làm cho nó phức tạp hơn.Cách rõ ràng có lẽ nhanh hơn để làm điều đó là chỉ lặp bằng tay từ cuối cho đến khi chúng ta tìm thấy một giá trị, sau đó xóa giá trị đó. Điều đó cũng tránh phải đối phó với
In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
2. Sử dụng In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
3 có thể giúp đỡ nhưng làm cho nó đúng [mà không sao chép toàn bộ] có thể rất khó khăn.Vì vậy, hãy so sánh những thứ này với mã hiện tại của bạn, cả hai đã gói nó trong ____ 14/________ 15 và trong một
In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
6:def f_rev_ex[xs, s]:
xs.reverse[]
try:
xs.remove[s]
except ValueError:
pass
xs.reverse[]
def f_rev_if[xs, s]:
if s in xs:
xs.reverse[]
xs.remove[s]
xs.reverse[]
def f_for[xs, s]:
for i in range[len[xs]-1, -1, -1]:
if s == xs[i]:
del xs[i]
break
def f_enum[xs, s]:
for i, x in reversed[list[enumerate[xs]]]:
if x == s:
del xs[i]
break
Đối với một danh sách nhỏ như của bạn, bài kiểm tra thậm chí không đáng để chạy, vì vậy tôi đã phát minh ra dữ liệu ngẫu nhiên của riêng mình [trong cuộc sống thực, tất nhiên là bạn phải biết dữ liệu của mình]:
In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
Chà, cái cuối cùng đó không phải là một ý tưởng rất hay, nhưng cái còn lại nhanh hơn khoảng 25% so với những gì chúng tôi bắt đầu. Vì vậy, chúng tôi đã lưu toàn bộ 9 micro giây, trên dữ liệu 4 đơn đặt hàng lớn hơn dữ liệu thực tế của bạn. Tùy thuộc vào bạn liệu điều đó có xứng đáng với mã không thể đọc được, dễ bị ảnh hưởng hơn hay không. .
Trong hướng dẫn này, chúng tôi sẽ xem xét cách loại bỏ sự xuất hiện cuối cùng của một ký tự khỏi một chuỗi trong Python với sự trợ giúp của một số ví dụ.
Làm thế nào để loại bỏ thể hiện cuối cùng của một ký tự trong một chuỗi?
Chuỗi là bất biến trong Python. Đó là, chúng không thể được sửa đổi sau khi chúng được tạo ra. Tuy nhiên, bạn có thể tạo một bản sao của chuỗi gốc với lần xuất hiện cuối cùng của ký tự.
Sử dụng các bước sau -
- Tìm chỉ số của sự xuất hiện cuối cùng của ký tự trong chuỗi.
- Đối với điều này, trước tiên, đảo ngược chuỗi và tìm chỉ mục đầu tiên của ký tự trong chuỗi đảo ngược.
- Sau đó, trừ chỉ mục này và một từ độ dài của chuỗi để lấy chỉ mục cuối cùng của ký tự trong chuỗi gốc.
- Sau đó, sử dụng chỉ mục trên để cắt chuỗi ban đầu sao cho ký tự ở chỉ mục đó bị bỏ qua.
Hãy nhìn vào một ví dụ -
# create a string s = "not me, not her" # get index of last occurrence of 'n' rev_s = s[::-1] i = len[s] - rev_s.index['n'] - 1 # remove the character at index i in s print[s[:i]+s[i+1:]]
Output:
not me, ot her
Bạn có thể thấy rằng chuỗi đầu ra không chứa sự xuất hiện cuối cùng của ký tự ’n, từ chuỗi gốc. Ngoài ra, lưu ý rằng các lần xuất hiện khác của nhân vật ’n, trong chuỗi không bị ảnh hưởng.
Để biết thêm về hàm Python String Index [], hãy tham khảo tài liệu của nó.
Sử dụng một vòng lặp để xóa sự xuất hiện cuối cùng của ký tự trong chuỗi
Ngoài ra, bạn cũng có thể sử dụng một vòng lặp để lặp lại thông qua các ký tự của chuỗi gốc từ bên phải và loại bỏ sự xuất hiện cuối cùng của một ký tự khỏi một chuỗi trong Python. Sử dụng các bước sau -
- Tạo một chuỗi trống để lưu trữ kết quả của chúng tôi và một lá cờ được đặt thành
8 để xác định xem chúng tôi có gặp phải ký tự mà chúng tôi muốn xóa hay không.In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]] In [59]: %timeit y = x[:]; f_rev_ex[y, 'a'] 10000 loops, best of 3: 34.7 µs per loop In [60]: %timeit y = x[:]; f_rev_if[y, 'a'] 10000 loops, best of 3: 35.1 µs per loop In [61]: %timeit y = x[:]; f_for[y, 'a'] 10000 loops, best of 3: 26.6 µs per loop In [62]: %timeit y = x[:]; f_enum[y, 'a'] 1000 loops, best of 3: 604 µs per loop
- Lặp qua mỗi ký tự trong chuỗi từ bên phải.
- Đối với mỗi ký tự, hãy kiểm tra xem nó có bằng với ký tự mà chúng tôi muốn xóa không và liệu cờ có phải là
8 không. Nếu cả hai điều kiện là đúng, hãy đặt cờ thànhIn [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]] In [59]: %timeit y = x[:]; f_rev_ex[y, 'a'] 10000 loops, best of 3: 34.7 µs per loop In [60]: %timeit y = x[:]; f_rev_if[y, 'a'] 10000 loops, best of 3: 35.1 µs per loop In [61]: %timeit y = x[:]; f_for[y, 'a'] 10000 loops, best of 3: 26.6 µs per loop In [62]: %timeit y = x[:]; f_enum[y, 'a'] 1000 loops, best of 3: 604 µs per loop
# create a string s = "not me, not her" # get index of last occurrence of 'n' rev_s = s[::-1] i = len[s] - rev_s.index['n'] - 1 # remove the character at index i in s print[s[:i]+s[i+1:]]
0 và bỏ qua lần lặp tiếp theo. Khác, thêm ký tự vào chuỗi kết quả của chúng tôi. - Đảo ngược chuỗi kết quả để lấy chuỗi ban đầu của chúng tôi với phiên bản cuối cùng của ký tự bị xóa.
Hãy nhìn vào một ví dụ -
# create a string s = "not me, not her" result = "" ch_to_remove = 'n' occurred_flag = False # iterate over each character in s from right for ch in s[::-1]: if ch == ch_to_remove and occurred_flag == False: occurred_flag = True continue else: result += ch # reverse the result result = result[::-1] # display the resulting string print[result]
Output:
not me, ot her
Bạn có thể thấy rằng chuỗi đầu ra không chứa sự xuất hiện cuối cùng của ký tự ’n, từ chuỗi gốc. Ngoài ra, lưu ý rằng các lần xuất hiện khác của nhân vật ’n, trong chuỗi không bị ảnh hưởng.
Để biết thêm về hàm Python String Index [], hãy tham khảo tài liệu của nó.
- Sử dụng một vòng lặp để xóa sự xuất hiện cuối cùng của ký tự trong chuỗi
- Ngoài ra, bạn cũng có thể sử dụng một vòng lặp để lặp lại thông qua các ký tự của chuỗi gốc từ bên phải và loại bỏ sự xuất hiện cuối cùng của một ký tự khỏi một chuỗi trong Python. Sử dụng các bước sau -
- Tạo một chuỗi trống để lưu trữ kết quả của chúng tôi và một lá cờ được đặt thành
8 để xác định xem chúng tôi có gặp phải ký tự mà chúng tôi muốn xóa hay không.In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]] In [59]: %timeit y = x[:]; f_rev_ex[y, 'a'] 10000 loops, best of 3: 34.7 µs per loop In [60]: %timeit y = x[:]; f_rev_if[y, 'a'] 10000 loops, best of 3: 35.1 µs per loop In [61]: %timeit y = x[:]; f_for[y, 'a'] 10000 loops, best of 3: 26.6 µs per loop In [62]: %timeit y = x[:]; f_enum[y, 'a'] 1000 loops, best of 3: 604 µs per loop
- Lặp qua mỗi ký tự trong chuỗi từ bên phải.
Đối với mỗi ký tự, hãy kiểm tra xem nó có bằng với ký tự mà chúng tôi muốn xóa không và liệu cờ có phải là
8 không. Nếu cả hai điều kiện là đúng, hãy đặt cờ thành In [58]: xs = [random.choice[string.ascii_lowercase] for _ in range[10000]]
In [59]: %timeit y = x[:]; f_rev_ex[y, 'a']
10000 loops, best of 3: 34.7 µs per loop
In [60]: %timeit y = x[:]; f_rev_if[y, 'a']
10000 loops, best of 3: 35.1 µs per loop
In [61]: %timeit y = x[:]; f_for[y, 'a']
10000 loops, best of 3: 26.6 µs per loop
In [62]: %timeit y = x[:]; f_enum[y, 'a']
1000 loops, best of 3: 604 µs per loop
# create a string
s = "not me, not her"
# get index of last occurrence of 'n'
rev_s = s[::-1]
i = len[s] - rev_s.index['n'] - 1
# remove the character at index i in s
print[s[:i]+s[i+1:]]
0 và bỏ qua lần lặp tiếp theo. Khác, thêm ký tự vào chuỗi kết quả của chúng tôi.
We do not spam and you can opt out any time.
Đảo ngược chuỗi kết quả để lấy chuỗi ban đầu của chúng tôi với phiên bản cuối cùng của ký tự bị xóa.
Chúng tôi nhận được kết quả tương tự như trên. Chuỗi kết quả có thể loại bỏ ký tự cuối cùng. Lưu ý rằng phương pháp này quá dài so với phương pháp trước đó.