Trong trường hợp bạn đang tự hỏi về hiệu suất của các phương pháp khác nhau, đây là một số thời gian:
In [1]: words = [str[i] for i in range[10000]]
In [2]: %timeit replaced = [w.replace['1', ''] for w in words]
100 loops, best of 3: 2.98 ms per loop
In [3]: %timeit replaced = map[lambda x: str.replace[x, '1', ''], words]
100 loops, best of 3: 5.09 ms per loop
In [4]: %timeit replaced = map[lambda x: x.replace['1', ''], words]
100 loops, best of 3: 4.39 ms per loop
In [5]: import re
In [6]: r = re.compile['1']
In [7]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 6.15 ms per loop
Như bạn có thể thấy đối với các mẫu đơn giản như vậy, sự hiểu biết danh sách được chấp nhận là nhanh nhất, nhưng hãy nhìn vào những điều sau đây:
In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
Điều này cho thấy rằng để thay thế phức tạp hơn, một reg-exp được biên dịch sẵn [như trong
In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
6] có thể nhanh hơn [nhiều]. Nó thực sự phụ thuộc vào vấn đề của bạn và phần ngắn nhất của reg-exp. Trong Python, bạn có thể tạo một danh sách mới từ danh sách các chuỗi bằng cách trích xuất, thay thế hoặc chuyển đổi các yếu tố đáp ứng các điều kiện nhất định với sự hiểu biết danh sách.
Bài viết này giải thích ngắn gọn về sự hiểu biết danh sách và sau đó mô tả những điều sau đây với mã mẫu.
- Trích xuất các chuỗi chứa hoặc không chứa một chuỗi cụ thể
- Thay thế một chuỗi cụ thể trong danh sách
- Trích xuất các chuỗi bắt đầu hoặc không bắt đầu bằng một chuỗi cụ thể
- Trích xuất các chuỗi kết thúc hoặc không kết thúc bằng một chuỗi cụ thể
- Trích xuất chuỗi bằng chữ hoa hoặc chữ thường
- Chuyển đổi chữ hoa và chữ thường
- Trích xuất chuỗi bằng chữ cái hoặc số
- Nhiều điều kiện
- Biểu thức chính quy [Regex]
Bạn có thể sử dụng các biểu thức thông thường [regex] để xử lý linh hoạt hơn.
- Re - Hoạt động biểu thức thường xuyên - Tài liệu Python 3.9.7
2 trả về một đối tượngl_replace = [s.replace['XXX', 'ZZZ'] for s in l] print[l_replace] # ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
3 nếu nó khớp hoặcl_replace = [s.replace['XXX', 'ZZZ'] for s in l] print[l_replace] # ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
4 nếu nó không khớp.l_replace = [s.replace['XXX', 'ZZZ'] for s in l] print[l_replace] # ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Vì các đối tượng l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
3 được đánh giá là [expression for variable_name in iterable if condition]
5 và l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
4 là l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
8, nếu bạn chỉ muốn trích xuất các phần tử phù hợp với mẫu regex, bạn nên áp dụng l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
2 cho phần In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
8 của các hiểu biết như trong các ví dụ trước.
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
[expression for variable_name in iterable if condition]
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
Bạn cũng có thể sử dụng
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print[l_replace_all]
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
1 để thay thế phần phù hợp với mẫu regex. Nếu bạn muốn trích xuất và chỉ thay thế các phần tử phù hợp, hãy thêm [expression for variable_name in iterable if condition]
1.- Làm thế nào để bạn thay thế một yếu tố cụ thể trong danh sách Python?
[expression for variable_name in iterable if condition]
Dưới đây là các phương pháp để thay thế các giá trị trong danh sách ..
[variable_name for variable_name in iterable if condition]
Sử dụng lập chỉ mục danh sách ..
Sử dụng cho vòng lặp ..
- Sử dụng trong khi vòng lặp ..
Sử dụng chức năng Lambda ..
- Sử dụng danh sách cắt ..
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
Thay thế một chuỗi cụ thể trong danh sách
Trích xuất các chuỗi bắt đầu hoặc không bắt đầu bằng một chuỗi cụ thể
Trích xuất các chuỗi kết thúc hoặc không kết thúc bằng một chuỗi cụ thể
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Trích xuất chuỗi bằng chữ hoa hoặc chữ thường
- Chuyển đổi chữ hoa và chữ thường
Trích xuất chuỗi bằng chữ cái hoặc số
- Sử dụng trong khi vòng lặp ..
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print[l_replace_all]
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Sử dụng chức năng Lambda ..
[['ZZZ' if ['XXX' in s] else s] for s in l]
Phương thức chuỗi
[variable_name for variable_name in iterable if condition]
5 trả về [expression for variable_name in iterable if condition]
5 nếu chuỗi bắt đầu bằng chuỗi cụ thể.l_start = [s for s in l if s.startswith['t']]
print[l_start]
# ['twoXXXbbb', 'three999aaa']
l_start_not = [s for s in l if not s.startswith['t']]
print[l_start_not]
# ['oneXXXaaa', '000111222']
Phương thức chuỗi
[variable_name for variable_name in iterable if condition]
7 trả về [expression for variable_name in iterable if condition]
5 nếu chuỗi kết thúc bằng chuỗi cụ thể.l_end = [s for s in l if s.endswith['aaa']]
print[l_end]
# ['oneXXXaaa', 'three999aaa']
l_end_not = [s for s in l if not s.endswith['aaa']]
print[l_end_not]
# ['twoXXXbbb', '000111222']
Bạn có thể sử dụng các phương thức chuỗi
[variable_name for variable_name in iterable if condition]
9, l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
0 để xác định xem một chuỗi là tất cả chữ hoa hay tất cả các chữ thường.In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
0Chuyển đổi chữ hoa và chữ thường
Nếu bạn muốn chuyển đổi tất cả các chữ cái thành chữ hoa hoặc chữ thường, hãy sử dụng các phương thức chuỗi
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
1 hoặc l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
2. Các phương pháp khác cũng được cung cấp, chẳng hạn như l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
3 để viết hoa chữ cái đầu tiên và l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
4 để trao đổi chữ hoa và chữ thường.Sử dụng các biểu thức có điều kiện để chỉ chuyển đổi những yếu tố thỏa mãn các điều kiện.
In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
1Bạn có thể sử dụng các phương thức chuỗi
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
5 và l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
6 để xác định xem một chuỗi là tất cả bảng chữ cái hay tất cả số.- Kiểm tra xem một chuỗi là số, chữ cái, chữ và số hay ASCII
In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
2Nhiều điều kiện
Bạn cũng có thể chỉ định nhiều điều kiện bằng cách sử dụng
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
7 và l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print[l_in]
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print[l_in_not]
# ['three999aaa', '000111222']
8 trong phần In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
8 của toàn bộ danh sách. Bạn cũng có thể sử dụng phủ định l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
0.Nếu bạn sử dụng nhiều hơn ba điều kiện, việc bao quanh mỗi nhóm với
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
1 sẽ an toàn hơn vì kết quả sẽ khác nhau tùy thuộc vào thứ tự.In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
3Biểu thức chính quy [Regex]
Bạn có thể sử dụng các biểu thức thông thường [regex] để xử lý linh hoạt hơn.
- Re - Hoạt động biểu thức thường xuyên - Tài liệu Python 3.9.7
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
2 trả về một đối tượng l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
3 nếu nó khớp hoặc l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
4 nếu nó không khớp.Vì các đối tượng
l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
3 được đánh giá là [expression for variable_name in iterable if condition]
5 và l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
4 là l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
8, nếu bạn chỉ muốn trích xuất các phần tử phù hợp với mẫu regex, bạn nên áp dụng l_replace = [s.replace['XXX', 'ZZZ'] for s in l]
print[l_replace]
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
2 cho phần In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
8 của các hiểu biết như trong các ví dụ trước.In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
4Bạn cũng có thể sử dụng
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print[l_replace_all]
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
1 để thay thế phần phù hợp với mẫu regex. Nếu bạn muốn trích xuất và chỉ thay thế các phần tử phù hợp, hãy thêm [expression for variable_name in iterable if condition]
1.In [8]: %timeit replaced = [w.replace['1', ''].replace['324', ''].replace['567', ''] for w in words]
100 loops, best of 3: 8.25 ms per loop
In [9]: r = re.compile['[1|324|567]']
In [10]: %timeit replaced = [r.sub['', w] for w in words]
100 loops, best of 3: 7.87 ms per loop
5