Trích xuất và thay thế các phần tử thỏa mãn các điều kiện của danh sách (mảng) chuỗi trong Python

Kinh doanh

Để tạo danh sách mới từ danh sách (mảng) có các phần tử là chuỗi, bằng cách chỉ trích xuất các phần tử của chuỗi thỏa mãn các điều kiện nhất định hoặc bằng cách thực hiện thay thế, chuyển đổi, v.v., hãy sử dụng tính năng hiểu danh sách.

Sau phần giải thích ngắn gọn về khả năng hiểu danh sách, các nội dung sau được giải thích bằng mã mẫu.

  • Trích xuất dựa trên việc có bao gồm một chuỗi cụ thể hay không (đối sánh một phần)
  • Thay thế chuỗi cụ thể
  • Trích xuất bằng cách bắt đầu hoặc không bắt đầu bằng một chuỗi cụ thể
  • Trích xuất bằng cách kết thúc hoặc không kết thúc bằng một chuỗi cụ thể
  • Được đánh giá và trích xuất theo từng trường hợp
  • Chuyển đổi chữ hoa và chữ thường
  • Xác định xem các ký tự chữ cái hay số được sử dụng và trích xuất chúng
  • Nhiều điều kiện
  • (máy tính) biểu thức chính quy

Lưu ý rằng danh sách có thể lưu trữ các loại dữ liệu khác nhau và hoàn toàn khác với mảng. Nếu bạn muốn xử lý mảng trong các quy trình yêu cầu kích thước bộ nhớ và địa chỉ bộ nhớ hoặc xử lý số đối với dữ liệu lớn, hãy sử dụng mảng (thư viện chuẩn) hoặc NumPy.

ký hiệu bao gồm danh sách

Khi tạo một danh sách mới từ một danh sách, phần hiểu danh sách dễ viết hơn các vòng lặp for.

[expression for any variable name in iterable object if conditional expression]

Nếu phần tử chỉ được chọn bởi một biểu thức điều kiện, nó không được xử lý bởi một biểu thức, vì vậy nó có dạng sau

[variable name for variable name in original list if conditional expression]

Nếu biểu thức điều kiện if được tạo thành biểu thức điều kiện if not, nó sẽ trở thành một phủ định và các phần tử không thỏa mãn biểu thức điều kiện có thể được trích xuất.

Chứa một chuỗi cụ thể (khớp một phần) \ Không chứa:in

Trong “chuỗi cụ thể trong chuỗi gốc”, trả về giá trị True nếu chuỗi gốc chứa chuỗi cụ thể. Đây là một biểu thức điều kiện.

Sự phủ định của in được thực hiện với not in.

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ế chuỗi cụ thể

Nếu bạn muốn thay thế một chuỗi các phần tử danh sách, hãy sử dụng phương thức chuỗi Replace () cho mỗi phần tử trong ký hiệu hiểu danh sách.

Nếu không có chuỗi nào cần thay thế, không cần chọn phần tử trong biểu thức điều kiện if vì nó sẽ không bị thay đổi bằng cách áp dụng Replace ().

l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']

Nếu bạn muốn thay thế toàn bộ phần tử có chứa một chuỗi cụ thể, hãy giải nén nó bằng trong và xử lý nó bằng toán tử bậc ba. Toán tử bậc ba được viết dưới dạng sau.
True Value if Conditional Expression else False Value

Sẽ được nếu phần biểu thức của ký hiệu hiểu danh sách là một toán tử bậc ba.

l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']

Sau đây là tóm tắt kết quả, được đặt trong ngoặc đơn. Nếu bạn không quen sử dụng dấu ngoặc đơn thì có thể dễ hiểu hơn và tránh sai sót. Về mặt ngữ pháp, không có vấn đề gì ngay cả khi bạn viết dấu ngoặc đơn.

[('ZZZ' if ('XXX' in s) else s) for s in l]

Việc sử dụng in như một điều kiện gây nhầm lẫn với ký hiệu hiểu danh sách trong, nhưng không khó nếu bạn biết về dạng cú pháp của ký hiệu hiểu danh sách và các toán tử bậc ba.

Bắt đầu bằng một chuỗi cụ thể \ không bắt đầu:startswith()

Phương thức chuỗi startwith () trả về true nếu chuỗi bắt đầu bằng chuỗi được chỉ định trong đối số.

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']

Kết thúc bằng một chuỗi ký tự cụ thể \ không kết thúc:endswith()

Phương thức chuỗi endwith () trả về true nếu chuỗi kết thúc bằng chuỗi được chỉ định trong đối số.

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']

Được đánh giá và trích xuất theo từng trường hợp

Các phương thức chuỗi isupper (), islower () có thể được sử dụng để xác định xem một chuỗi là tất cả chữ hoa hay chữ thường.

l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']

Chuyển đổi chữ hoa và chữ thường

Nếu bạn muốn chuyển đổi tất cả các ký tự thành chữ hoa hoặc chữ thường, hãy sử dụng các phương thức chuỗi upper () và Lower (). Các phương thức khác bao gồm capitalize (), chỉ viết hoa chữ cái đầu tiên và swapcase (), hoán đổi chữ hoa và chữ thường.

Như trong ví dụ thay thế ở trên, hãy sử dụng toán tử bậc ba nếu bạn chỉ muốn xử lý các phần tử thỏa mãn điều kiện.

l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']

l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']

Xác định xem các ký tự chữ cái hay số được sử dụng và trích xuất chúng

Các phương thức chuỗi isalpha () và isnumeric () có thể được sử dụng để xác định xem một chuỗi có phải là tất cả các chữ cái, số, v.v.

l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']

l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']

Nhiều điều kiện

Phần biểu thức điều kiện của sự hiểu danh sách có thể là nhiều điều kiện. Điều kiện “không phải” phủ định cũng có thể được sử dụng.

Khi sử dụng ba biểu thức điều kiện trở lên, sẽ an toàn hơn nếu đặt mỗi nhóm trong dấu ngoặc đơn () vì kết quả sẽ thay đổi tùy theo thứ tự.

l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']

l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']

(máy tính) biểu thức chính quy

Biểu thức chính quy cho phép xử lý rất linh hoạt.

Đối tượng khớp được trả về bởi re.match () khi đối sánh luôn được xác định là đúng khi được đánh giá bằng biểu thức điều kiện. Nếu không khớp, nó trả về Không có, điều này là sai trong biểu thức điều kiện. Vì vậy, nếu bạn chỉ muốn trích xuất các phần tử phù hợp với biểu thức chính quy, chỉ cần áp dụng re.match () cho phần biểu thức điều kiện của biểu thức hiểu danh sách như trước.

import re

l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']

l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']

re.sub (), thay thế phần đã so khớp của một biểu thức chính quy, cũng rất hữu ích. Để chỉ trích xuất và thay thế các phần tử đã so khớp, chỉ cần thêm “biểu thức điều kiện if”.

l_re_sub_all = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']

l_re_sub = [re.sub('(.*)XXX(.*)', r'\2---\1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']
Copied title and URL