Xác định xem một danh sách (mảng) có các phần tử trùng lặp trong Python hay không

Kinh doanh

Sau đây là mô tả về cách xác định xem một danh sách (mảng) có các phần tử trùng lặp (tất cả các phần tử là duy nhất / duy nhất) trong Python, cho mỗi trường hợp sau.

  • Đối với một danh sách không có danh sách trong phần tử
  • Đối với danh sách có danh sách các phần tử (mảng hai chiều, danh sách các danh sách, v.v.)

Xem bài viết sau về cách xóa hoặc trích xuất các phần tử trùng lặp khỏi danh sá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.

Xác định xem có phần tử trùng lặp trong danh sách hay không (nếu phần tử không có danh sách)

Nếu phần tử không có đối tượng có thể cập nhật, chẳng hạn như danh sách, hãy sử dụng hàm khởi tạo set () của kiểu tập hợp.

Kiểu tập hợp là kiểu dữ liệu không có phần tử trùng lặp. Khi một danh sách được chuyển đến phương thức khởi tạo set (), các giá trị trùng lặp sẽ bị bỏ qua và một đối tượng thuộc loại set chỉ có các giá trị duy nhất là các phần tử được trả về.

Số lượng phần tử trong đối tượng kiểu tập hợp này và danh sách ban đầu được lấy và so sánh bằng cách sử dụng hàm len () cài sẵn.

  • Nếu số phần tử bằng nhau thì không có phần tử nào trùng lặp trong danh sách ban đầu
  • Các phần tử trùng lặp được đưa vào danh sách ban đầu nếu số phần tử khác nhau

Các hàm trả về false nếu không có phần tử trùng lặp và true nếu có phần tử trùng lặp như sau

def has_duplicates(seq):
    return len(seq) != len(set(seq))

l = [0, 1, 2]
print(has_duplicates(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates(l))
# True

Ví dụ là một danh sách, nhưng chức năng tương tự có thể được sử dụng với các bộ giá trị.

Các đối tượng có thể thay đổi (có thể cập nhật) như danh sách không thể là phần tử của tập hợp kiểu. Do đó, danh sách có danh sách là phần tử (mảng hai chiều, danh sách danh sách, v.v.) sẽ dẫn đến Lỗi kiểu. Các biện pháp đối phó được hiển thị dưới đây.

l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'

Xác định xem có phần tử trùng lặp trong danh sách hay không (nếu phần tử có danh sách)

Trong trường hợp một danh sách có một danh sách các phần tử (chẳng hạn như một danh sách), các hàm sau đây có thể được sử dụng để xác định xem có phần tử trùng lặp hay không.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False

l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True

Thay vì set (), ký hiệu hiểu danh sách tạo ra một danh sách có các phần tử chỉ là giá trị duy nhất và số lượng phần tử được so sánh. Xem chi tiết bài viết sau.

Hàm này cũng hợp lệ cho các danh sách không có danh sách các phần tử.

l = [0, 1, 2]
print(has_duplicates2(l))
# False

l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True

Ví dụ cho đến nay là việc xác định xem danh sách các phần tử có bị trùng lặp (chứa cùng một danh sách) hay không.

Liệu các phần tử của mỗi danh sách có trùng lặp hay không có thể được xác định sau khi làm phẳng danh sách ban đầu thành một thứ nguyên.

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True

Ở đây, sum () được sử dụng để làm phẳng danh sách, nhưng itertools.chain.from_iterable () cũng có thể được sử dụng. Ngoài ra, khi làm phẳng một danh sách có ba chiều trở lên, cần phải xác định một chức năng mới.