CodeGym /Các khóa học /Python SELF VI /Công việc thực hành với danh sách

Công việc thực hành với danh sách

Python SELF VI
Mức độ , Bài học
Có sẵn

9.1 Tạo bản sao của danh sách

Tạo bản sao danh sách trong Python là một nhiệm vụ quan trọng, có thể cần thiết để tránh những thay đổi không mong muốn trong dữ liệu khi thao tác với danh sách. Khi làm việc với danh sách, quan trọng là phải hiểu sự khác biệt giữa sao chép nông (shallow) và sao chép sâu (deep).

Sao chép nông

Sao chép nông tạo ra một danh sách mới, nhưng các phần tử vẫn giữ nguyên (nếu các phần tử là các tham chiếu, chúng được sao chép như các tham chiếu). Điều này có thể thực hiện bằng một vài cách:

Sử dụng hàm list():


original = [1, 2, 3]
copy = list(original)

Sử dụng lát cắt (slicing):


original = [1, 2, 3]
copy = original[:]

Phương thức copy():

Sao chép sâu

Sao chép sâu tạo ra một danh sách mới, trong đó cũng tạo ra các bản sao của tất cả các đối tượng lồng ghép. Điều này đặc biệt quan trọng khi danh sách chứa các loại dữ liệu có thể thay đổi khác, như các danh sách khác. Để làm điều này, sử dụng module copy:


import copy
original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)

Khi nào sử dụng từng phương thức

Sao chép nông nhanh hơn và phù hợp khi các phần tử trong danh sách đơn giản hoặc không cần sao chép (ví dụ, chuỗi hoặc số). Sao chép sâu cần thiết khi các phần tử trong danh sách tự chúng là các bộ sưu tập có thể thay đổi hoặc khi các thay đổi trong bản sao không nên ảnh hưởng tới bản gốc.

9.2 Xóa phần tử khỏi danh sách

Có một nhiệm vụ đơn giản mà phức tạp: xóa phần tử từ danh sách trong vòng lặp.

Khi chúng ta đi qua danh sách bằng vòng lặp for, danh sách trả về một đối tượng con đặc biệt — iterator, được vòng lặp for sử dụng để duyệt qua tất cả các phần tử. Và nếu trong quá trình sử dụng iterator [bằng vòng lặp for] xóa một phần tử khỏi danh sách, thì iterator có thể hoạt động không đúng.

Nếu bạn xóa phần tử thứ 3, thì phần tử thứ 4 tự động trở thành phần tử thứ 3. Nhưng vòng lặp for, thông qua iterator, chuyển sang phần tử thứ 4 mới, vốn trước đây là phần tử thứ 5. Và thế là phần tử thứ 4 sẽ bị bỏ qua.

Đây là một vài cách để an toàn xóa phần tử:

Sử dụng phương thức remove()

Nếu bạn biết chính xác phần tử nào cần xóa, có thể sử dụng remove() trong vòng lặp. Tuy nhiên, điều này có thể không hiệu quả nếu có nhiều phần tử, vì mỗi lần gọi remove() tìm kiếm phần tử trước khi xóa, điều này làm chậm quá trình thực thi.

Tạo danh sách mới

Cách an toàn hơn — tạo danh sách mới chỉ với các phần tử cần giữ lại:


original_list = [1, 2, 3, 4, 5, 6]
new_list = [x for x in original_list if x % 2 != 0]  # chỉ giữ lại số lẻ

Sử dụng chỉ số

Có thể sử dụng vòng lặp for với chỉ số ngược để xóa phần tử mà không bị bỏ sót:


for i in range(len(original_list) - 1, -1, -1):
    if original_list[i] % 2 == 0:  # điều kiện để xóa
        del original_list[i]

Khi chúng ta đi qua danh sách từ cuối, thì khi xóa đi các phần tử, chỉ những phần tử đã đi qua mới bị thay đổi chỉ số.

Sử dụng bản sao của danh sách:

Giả sử bạn muốn xóa tất cả số âm khỏi danh sách:


numbers = [1, -1, 2, -2, 3, -3]
# Tạo bản sao của danh sách để lặp an toàn
for number in numbers.copy():
    if number < 0:
        numbers.remove(number)
print(numbers) # Xuất ra [1, 2, 3]

9.3 Kết hợp danh sách

Rất thường xuyên cần phải kết hợp hai hoặc nhiều danh sách vào một. Điều này có thể được thực hiện bằng một số cách khác nhau, mỗi cách phù hợp với các nhiệm vụ khác nhau và có các đặc điểm riêng.

Sử dụng toán tử +

Cách đơn giản nhất để kết hợp hai danh sách — sử dụng toán tử +. Đây là một phương pháp trực tiếp và dễ hiểu:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list)  # Xuất ra [1, 2, 3, 4, 5, 6]

Phương thức extend()

Phương thức extend() thay đổi danh sách đầu tiên, thêm vào cuối nó tất cả phần tử của danh sách thứ hai. Điều này thay đổi danh sách gốc:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1)  # Xuất ra [1, 2, 3, 4, 5, 6]

Danh sách kết hợp (List Comprehensions)

Danh sách kết hợp có thể được sử dụng để tạo ra danh sách mới bằng cách kết hợp các phần tử từ nhiều danh sách thành một danh sách phức tạp:


list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [item for sublist in [list1, list2] for item in sublist]
print(combined_list)  # Xuất ra [1, 2, 3, 4, 5, 6]

Phương thức append()

Có thể thêm tất cả phần tử của danh sách 2 vào danh sách 1 từng cái một. Thì, cũng là một lựa chọn.


list1 = [1, 2, 3]
list2 = [4, 5, 6]
for x in list2:
    list1.append(x)
print(list1)  # Xuất ra [1, 2, 3, 4, 5, 6]

Nói chung, đó là tất cả những gì mình muốn nói với các bạn về danh sách 😊

1
Опрос
Danh sách trong Python,  7 уровень,  9 лекция
недоступен
Danh sách trong Python
Danh sách trong Python
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION