Trích xuất, thay thế và chuyển đổi các phần tử cụ thể của danh sách Python (mảng)

Kinh doanh

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

Phần sau được giải thích ở đây, cùng với mã mẫu.

  • Dạng cơ bản của ký hiệu hiểu danh sách
  • Áp dụng quy trình cho tất cả các phần tử của danh sách
  • Trích xuất và xóa các phần tử khỏi danh sách đáp ứng tiêu chí
  • Thay thế hoặc chuyển đổi các phần tử thỏa mãn các điều kiện của danh sách

Xem bài viết sau để biết các ví dụ cụ thể về danh sách các chuỗi.

Cũng có thể trích xuất ngẫu nhiên các phần tử không đáp ứng tiêu chí.

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.

Danh sách sau đây là một ví dụ

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Dạng cơ bản của ký hiệu hiểu 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]

Một biểu thức được áp dụng cho một phần tử thỏa mãn biểu thức điều kiện của một đối tượng có thể lặp lại (chẳng hạn như một danh sách hoặc bộ dữ liệu) và trở thành một phần tử của một danh sách mới. Có thể bỏ qua “if biểu thức điều kiện”, trong trường hợp đó, biểu thức được áp dụng cho tất cả các phần tử.

Xem bài viết sau để biết thêm chi tiết, bao gồm ký hiệu hiểu danh sách lồng nhau.

Áp dụng quy trình cho tất cả các phần tử của danh sách

Ví dụ: nếu bạn muốn áp dụng một số xử lý cho tất cả các phần tử của danh sách, hãy mô tả xử lý mong muốn trong biểu thức hiểu danh sách ở trên.

l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]

l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']

Điều này có thể được sử dụng để chuyển đổi giữa danh sách số và danh sách chuỗi.

Trích xuất và xóa các phần tử khỏi danh sách đáp ứng tiêu chí

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]

Một danh sách mới được tạo từ đó chỉ các phần tử thỏa mãn điều kiện (các phần tử mà biểu thức điều kiện là đúng) mới được trích xuất.

l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]

l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]

Nếu “nếu biểu thức điều kiện” được đặt thành “nếu không phải là biểu thức điều kiện” thì nó sẽ trở thành một phủ định và chỉ các phần tử không thỏa mãn điều kiện (các phần tử mà biểu thức điều kiện là sai) mới có thể được chọn và trích xuất. Nói cách khác, một danh sách mới được tạo ra từ đó các phần tử thỏa mãn điều kiện sẽ bị loại bỏ.

l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Tất nhiên, kết quả tương tự cũng nhận được bằng cách chỉ định biểu thức điều kiện tương đương mà không sử dụng not.

l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Phần biểu thức điều kiện có thể là nhiều điều kiện. Các ký hiệu âm cũng có thể được sử dụng.

l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]

l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]

Thay thế hoặc chuyển đổi các phần tử thỏa mãn các điều kiện của danh sách

Trong ví dụ về trích xuất phần tử ở trên, các phần tử không thỏa mãn điều kiện sẽ bị loại bỏ.

Nếu bạn chỉ muốn thực hiện thay thế, chuyển đổi, v.v. trên các phần tử thỏa mãn điều kiện, hãy áp dụng toán tử bậc ba cho phần biểu thức của ký hiệu hiểu danh sách.

Trong Python, toán tử bậc ba có thể được viết như sau

True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100

b = 30
y = 100 if b > 50 else 0
print(y)
# 0

Nó hơi phức tạp, nhưng sự kết hợp của ký hiệu hiểu danh sách và các toán tử bậc ba như sau.

[True Value if Conditional Expression else False Value for any variable name in original list]

Phần được đặt trong dấu ngoặc đơn là toán tử bậc ba (không cần dấu ngoặc đơn trong mã thực).

[(True Value if Conditional Expression else False Value) for any variable name in original list]

Nếu bất kỳ tên biến nào được viết theo giá trị true hoặc false, giá trị của phần tử ban đầu được sử dụng như nguyên trạng. Nếu một biểu thức được viết, quá trình xử lý biểu thức đó sẽ được áp dụng.

l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]

l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]

l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]

l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]