Xóa phần tử trùng nhau trong list python | Laptrinhcanban.com

Xóa phần tử trùng nhau trong list python

Hướng dẫn tất cả các cách xóa phần tử trùng nhau trong list python. Bạn sẽ học được cách xóa phần tử trong list python trong trường hợp không cần hoặc là muốn giữ nguyên thứ tự list ban đầu bằng hàm set(), hàm dict.fromkeys() hoặc hàm sorted(). Bạn cũng sẽ biết cách xóa phần tử trùng nhau trong list hai chiều bằng một hàm tự tạo sau bài học này.

Chúng ta có 3 phương pháp để xóa phần tử trùng nhau trong list python như sau:

  • Hàm set(): Xóa phần tử trùng nhau mà không giữ thứ tự list ban đầu
  • hàm dict.fromkeys() và hàm sorted(): xóa phần tử trùng nhau và giữ nguyên thứ tự list ban đầu
  • hàm tự tạo với list comprehension: xóa phần tử trùng nhau trong các list hai chiều

Lại nữa trong trường hợp bạn chỉ muốn xóa phần tử trong list python theo cách thông thường, hãy xem bài viết Xóa phần tử trong list python.

Xóa phần tử trùng nhau mà không giữ thứ tự list ban đầu | hàm set()

Khi chúng ta muốn xóa phần tử trùng nhau trong list python mà không cần giữ nguyên thứ tự trong list ban đầu, hãy sử dụng tới hàm set() trong python.

Hàm set() sẽ chuyển list thành set trong python, và do trong kiểu set các phần tử sẽ là duy nhất và không thể trùng nhau, nên các phần tử trùng nhau trong list ban đầu sẽ được xóa đi.

Cuối cùng, chúng ta chuyển lại set chứa các phần tử không trùng nhau ở trên về kiểu list bằng cách dùng hàm list() trong python là xong.

Lưu ý là do trong kiểu set không tồn tại index nên thứ tự trong list ban đầu sẽ không được giữ nguyên.

Ví dụ cụ thể:

l = [1, 2, 3, 1, 2, 4, 4, 2, 3]

# Chuyển list sang set và xóa phần tử trùng nhau
s = set(l)
print(s)
#>> {1, 2, 3, 4}

# Chuyển lại set về list
unique_l = list(s)
print(unique_l)
#>> [1, 2, 3, 4]

Bạn cũng có thể xóa phần tử trùng nhau thuộc kiểu chuỗi trong list python bằng cách sử dụng hàm set() như sau:

l = ['red', 'blue', 'yellow', 'black' , 'red']
unique_l=list(set(l))

print(unique_l)
#>> ['blue', 'black', 'yellow', 'red']

Lưu ý với các list trong list python hoặc tuple trong list python, bạn không thể dùng hàm set() để xóa phần tử trùng nhau, vì lỗi TypeError sẽ xảy ra:

l = [ 1, 2,  [3, 4] , [3,4]]
unique_l=list(set(l))

>>> TypeError: unhashable type: 'list'

Chúng ta sẽ tìm hiểu cách xóa phần tử trùng nhau trong các list hai chiều như thế ở phần dưới.

Xóa phần tử trùng nhau và giữ nguyên thứ tự list ban đầu

Do trong kiểu set không tồn tại index của phần tử, nên phương pháp sử dụng set để xóa phần tử trùng nhau trong list không thể giữ nguyên thứ tự trong list ban đầu.

Khi chúng ta muốn xóa phần tử trùng nhau trong list python và giữ nguyên thứ tự trong list ban đầu, thay vào set() hãy sử dụng tới hàm dict.fromkeys() hoặc hàm sorted() trong python.

Sử dụng hàm dict.fromkeys()

hàm dict.fromkeys() vốn sử dụng để chuyển một list hoặc một tuple thành key sử dụng trong kiểu dictionary python. Cũng giống như kiểu set, key trong dictionary cũng là các giá trị duy nhất và không thể trùng nhau nên chúng ta có thể ứng dụng để xóa phần tử trùng nhau trong list python. Lại nữa, do các key trong dictionary có thứ tự, nên nếu sử dụng dict.fromkeys() thì list thu về sẽ có thứ tự giống với list ban đầu.

Ví dụ cụ thể:

l = [1, 2, 3, 1, 2, 4, 4, 2, 3]

# Chuyển list sang dictionary và xóa phần tử trùng nhau
d = dict.fromkeys(l)
print(d)
#>> 1: None, 2: None, 3: None, 4: None}

# Chuyển lại dictionary về list
unique_l = list(d)
print(unique_l)
#>> [1, 2, 3, 4]

Tương tự với list chứa phần tử trùng nhau là string :

l = ['red', 'blue', 'yellow', 'black' , 'red']
unique_l=list(dict.fromkeys(l))

print(unique_l)
#>> ['red', 'blue', 'yellow', 'black']

Sử dụng hàm sorted()

Hàm dict.fromkeys() 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 để xóa phần tử trùng nhau trong list python mà vẫn giữ nguyên thứ tự trong list ban đầu bằng cách sử dụng hàm sorted() trong python.

Ví dụ cụ thể:

l = [1, 2, 3, 1, 2, 4, 4, 2, 3]
print(sorted(set(l), key=l.index))
#> [1, 2, 3, 4]

ll = ['red', 'blue', 'yellow', 'black' , 'red']
print(sorted(set(ll), key=ll.index))
#> ['red', 'blue', 'yellow', 'black']

Bạn cũng có thể tham khảo thêm cách dùng hàm sorted() tại bài Sắp xếp phần tử trong list python

Xóa phần tử trùng nhau trong các list hai chiều

Khi xóa phần tử trùng nhau trong list hai chiều (list trong list python), chúng ta không thể dùng các phương pháp ở trên, vì lỗi TypeError sẽ xảy ra:

l = [ 1, 2,  [3, 4] , [3,4]]
unique_l=list(set(l))

>>> TypeError: unhashable type: 'list'

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0]]
dict.fromkeys(l_2d)

>>> TypeError: unhashable type: 'list'

Lý do là bởi vì các list hai chiều như trên không thuộc dạng giá trị hashable , mà các phần tử trong set hoặc key trong dictionary chỉ có thể được tạo bởi các giá trị hashable nên lỗi đã xảy ra.

Do không có hàm hay phương thức có sẵn nào để xóa phần tử trùng nhau trong list hai chiều, nên chúng ta cần phải tự tạo ra một hàm để giải quyết bài toán này.

Ví dụ, bạn có thể sử dụng cách viết nội hàm (list comprehension) để viết hàm xóa như sau:

def unique_list(l_2d):
kiemtra = []
return [x for x in l_2d if x not in kiemtra and not kiemtra.append(x)]

Chúng ta gọi hàm và xóa phần tử trùng nhau trong các list hai chiều như sau:

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0]]
l_2d_unique = unique_list(l)
print(l_unique)
#>> [[1, 1], [0, 1], [0, 0]]

Bạn cũng có thể sử dụng hàm tự tạo trên để xóa phần tử trùng nhau trong các list hai chiều có phần tử thuộc các kiểu dữ liệu khác nhau.

Ví dụ như xóa phần tử trùng nhau trong list hai chiều có phần tử thuộc kiểu số và kiểu list.

l_2d = [ 1, 2,  [3, 4] , [3,4]]
print(unique_list(l_2d_2))
#>> [1, 2, [3, 4]]

Hoặc là hơn nữa, với một list hai chiều với phần tử thuộc cả tuple() nữa:

l_2d_mix = [ 1, 2, [3, 4] , [3,4] , ('a', 'b') , ('a', 'b') ]
print(unique_list(l_2d_mix))
#>> [1, 2, [3, 4], ('a', 'b')]

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách xóa 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 lại với các ví dụ hôm nay.

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 nhé.

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.