Kiểm tra và lấy phần tử trùng nhau trong list python | Laptrinhcanban.com

Kiểm tra và lấy phần tử trùng nhau trong list python

Hướng dẫn tất cả các cách kiểm tra và lấy phần tử trùng nhau trong list python. Bạn sẽ học được cách kiểm tra có phần tử trùng nhau trong list python, cũng như cách lấy phần tử trùng nhau trong list python nếu tồn tại phần tử trùng nhau trong list sau bài học này.

Kiểm tra phần tử trùng nhau trong list python

Kiểm tra phần tử trùng nhau trong list python thông thường

Để kiểm tra có tồn tại phần tử trùng nhau trong list python hay không, chúng ta sử dụng tới hàm set() trong python.

Trong bài viết Xóa phần tử trùng nhau trong list python chúng ta đã biết cách sử dụng hàm set để xóa đi phần tử trùng lặp trong list rồi phải không nào?

Ý tưởng ở đây sẽ là, chúng ta sẽ xóa phần tử trùng nhau trong list ban đầu để thu về một set, sau đó so sánh số phần tử trong set và trong list ban đầu với nhau. Nếu hai giá trị bằng nhau chứng tỏ không có phần tử trùng lặp nào bị xóa cả, do đó trong list ban đầu không tồn tại phần tử trùng nhau.

Và ngược lại, nếu hai giá trị này khác nhau, chứng tỏ trong list ban đầu có tồn tại phần tử trùng lặp.

Cụ thể chúng ta tạo ra một hàm kiểm tra phần tử trùng nhau trong list python và sử dụng như sau:

def check_duplicate_list(mylist):
if len(mylist) != len(set(mylist)):
return "Tồn tại phần tử trùng lặp trong list"
else:
return "Không có phần tử trùng lặp trong list"

l = [0, 1, 2]
print(check_duplicate_list(l))
##> Không có phần tử trùng lặp trong list

l = ['a', 'b', 'c', 'a']
print(check_duplicate_list(l))
##> Tồn tại phần tử trùng lặp trong list

Ngoài kiểm tra phần tử trùng nhau trong list, chúng ta cũng có thể sử dụng hàm tự tạo check_duplicate_list() ở trên để kiểm tra phần tử trùng nhau trong tuple như sau:

t = (0, 1, 2)
print(check_duplicate_list(t))
##> Không có phần tử trùng lặp trong list

t = ('a', 'b', 'c', 'a')
print(check_duplicate_list(t))
#>> Tồn tại phần tử trùng lặp trong list

Lưu ý là chúng ta không thể dùng phương pháp này để kiểm tra phần tử trùng nhau trong list 2 chiều trong python, do list hai chiều chứa các phần tử không phải là giá trị hasable nên không thể chuyển qua dạng set bằng hàm list được. Lỗi sau sẽ xảy ra.

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

Thay vào đó, chúng ta sẽ sử dụng phương pháp ở dưới đây.

Kiểm tra phần tử trùng nhau trong list 2 chiều trong python

Để kiểm tra phần tử trùng nhau trong list 2 chiều trong python, chúng ta cũng dùng chung ý tưởng với phương pháp kiểm tra phần tử trong list thông thường, đó là [xóa phần tử trùng nhau trong list hai chiều] và so sánh số phần tử trong list) trước và sau khi xóa.

Tuy nhiên do không thể dùng hàm set() với list 2 chiều nên chúng ta sẽ tạo một hàm mới và sử dụng hàm để kiểm tra phần tử trùng nhau trong list 2 chiều trong python như sau:

def check_duplicate_list_all(l_2d):
kiemtra = []
unique_list = [x for x in l_2d if x not in kiemtra and not kiemtra.append(x)]
if len(l_2d) != len(unique_list):
return "Tồn tại phần tử trùng lặp trong list"
else:
return "Không có phần tử trùng lặp trong list"


l_2d1 = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(check_duplicate_list_all(l_2d1))
#>> Không có phần tử trùng lặp trong list

l_2d2 = [['a', 'b'], ['a', 'b'], [1, 1], [1, 1]]
print(check_duplicate_list_all(l_2d2))
#>> Không có phần tử trùng lặp trong list

Kiểm tra phần tử trùng nhau trong list python tổng quát

Ở phần trên chúng ta đã biết rằng cách sử dụng hàm set() để kiểm tra phần tử trùng nhau trong list python không thể sử dụng được cho các list 2 chiều trong python, cũng như cách tạo riêng một hàm khác để kiểm tra phần tử trùng nhau trong list 2 chiều rồi.

Tuy nhiên điều đặc biệt ở đây đó là, thực ra hàm check_duplicate_list_all() mà chúng ta vừa tạo ở trên còn có thể sử dụng được cho cả list bình thường nữa.

Ví dụ:

def check_duplicate_list_all(l_2d):
kiemtra = []
unique_list = [x for x in l_2d if x not in kiemtra and not kiemtra.append(x)]
if len(l_2d) != len(unique_list):
return "Tồn tại phần tử trùng lặp trong list"
else:
return "Không có phần tử trùng lặp trong list"

l = [0, 1, 2]
print(check_duplicate_list_all(l))
##> Không có phần tử trùng lặp trong list

l = ['a', 'b', 'c', 'a']
print(check_duplicate_list_all(l))
##> Tồn tại phần tử trùng lặp trong list

Chúng ta cũng có thể sử dụng hàm trên để kiểm tra phần tử trùng nhau trong tuple python nữa:

t = (0, 1, 2)
print(check_duplicate_list_all(t))
##> Không có phần tử trùng lặp trong list

t = ('a', 'b', 'c', 'a')
print(check_duplicate_list_all(t))
#>> Tồn tại phần tử trùng lặp trong list

Do đó một cách tổng quát cho tất cả các trường hợp, bạn hãy dùng hàm tự tạo sau đây để kiểm tra phần tử trùng nhau trong list hoặc tuple trong python:

def check_duplicate_list_all(l_2d):
kiemtra = []
unique_list = [x for x in l_2d if x not in kiemtra and not kiemtra.append(x)]
if len(l_2d) != len(unique_list):
return "Tồn tại phần tử trùng lặp trong list hoặc tuple python"
else:
return "Không có phần tử trùng lặp trong list hoặc tuple python"

Lấy phần tử trùng nhau trong list python

Lấy phần tử trùng nhau trong list python | collections.Counter()

Để lấy phần tử trùng nhau trong list python, chúng ta sử dụng tới hàm Counter() trong module collection với cú pháp sau đây:

import collections

collections . Counter ( l )

Trong đó l là list cần lấy phần tử trùng nhau ra. Kết quả của hàm collections.Counter() là một dictionary với cặp khóa - giá trị là phần tử và số lần xuất hiện của nó trong list ban đầu.

Ví dụ:

import collections

l = [1, 2, 1, 2, 5, 3, 4, 2, 3]
c = collections.Counter(l)
print(c)
#>> Counter({2: 3, 1: 2, 3: 2, 5: 1, 4: 1})

Sau khi đã có kết quả của hàm Counter(), bằng cách sử dụng tới hàm item() trong python, chúng ta có thể lấy ra các key có value lớn hơn 1, chính là các phần tử trùng nhau trong list ban đầu.

Cụ thể chúng ta kết hợp với list comprehension và viết lệnh như sau:

print([k for k, v in collections.Counter(l).items() if v > 1])
# [1, 2, 3]

Lấy phần tử trùng nhau trong list python | hàm sorted()

Hàm collections.Counter() mới bắt đầu được sử dụng từ Python3.7, do đó chúng ta còn một cách cũ hơn để lấy phần tử trùng nhau trong list python là sử dụng hàm sorted() trong python.

Ví dụ cũng với list ở trên, chúng ta sẽ lấy các phần tử trùng nhau bằng sorted() như sau:

import collections

l = [1, 2, 1, 2, 5, 3, 4, 2, 3]
c = collections.Counter(l)
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
#>> [1, 2, 3]

Lại nữa, trong trường hợp bạn muốn lấy các phần tử đó trong trạng thái trùng lặp, chúng ta có thể sửa lại code một chút như sau:

import collections

l = [1, 2, 1, 2, 5, 3, 4, 2, 3]
c = collections.Counter(l)

print([x for x in l if cc[x] > 1])
#>> [1, 2, 1, 2, 3, 2, 3]

Lấy phần tử trùng nhau trong list 2 chiều trong python

Để lấy phần tử trùng nhau trong list 2 chiều trong python, do không thể sử dụng tới Couter() hay sorted() nên chúng ta cần tạo ra một hàm tự tạo để giải quyết vấn đề này.

Ví dụ chúng ta có một list 2 chiều như sau:

l = [[1, 2], [0, 1], [0, 1], [0, 0], [1, 0], [1, 2], [1, 2]]

Chúng ta sẽ tự tạo hàm lấy phần tử trùng nhau trong list 2 chiều ở trên như sau:
Lấy phần tử trùng nhau trong list 2 chiều trong python không cần giữ nguyên thứ tự ban đầu

def get_duplicate_list(l):
seen = []
return [x for x in l if not seen.append(x) and seen.count(x) == 2]

l = [[1, 2], [0, 1], [0, 1], [0, 0], [1, 0], [1, 2], [1, 2]]

print(get_duplicate_list(l))
#>> [[0, 1], [1, 2]]

Lấy phần tử trùng nhau trong list 2 chiều trong python giữ nguyên thứ tự ban đầu

    seen = []
return [x for x in l if l.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]

l = [[1, 2], [0, 1], [0, 1], [0, 0], [1, 0], [1, 2], [1, 2]]

print(get_duplicate_list_order(l))
#>> [[1, 2], [0, 1]]

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách kiểm tra và lấy phần tử trùng nhau trong list python rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về python trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.