2
Loại bỏ các phần tử trùng lắp trong mảng Python?
0
Therma20 đã đăng:

Cho mảng ký tự:

str = ['a', 'b', 'a', 'c', 'b', 'd', 'a', 'b']

Kết quả mong muốn:

str = ['a', 'b', 'c', 'd']

Làm sao ạ?

thêm bình luận...
1
I'm not yours30 đã đăng:

Bạn có thể sử dụng set để loại bỏ các phần tử trùng lắp, sau đó chuyển lại thành list như sau:

str = list( set(str) )

Theo Python Docs, set là một cấu trúc dữ liệu tương tự như list nhưng các phần tử trong set không thể bị trùng lắp và không có thứ tự ưu tiên. Không có thứ tự ưu tiên có nghĩa là vị trí của các phần tử trong set sẽ bị đảo lộn, sau khi chuyển ngược lại về mảng list, ta có thể được kết quả bao gồm các phần tử không bị trùng lắp nhưng vị trí của chúng không còn đúng so với ban đầu nữa.

print str
# = ['a', 'c', 'b', 'd']

Nếu bạn không quan tâm về vị trí của các phần tử sau khi loại đứa trùng lắp, bạn có thể dùng cách trên.

Câu trả lời của bạn đã đúng ý mình muốn, giả sử mình vẫn muốn giữ nguyên vị trí của các phần tử như ban đầu thì làm thế nào luôn ạ?

Therma 11.10.2018

Sử dụng OrderedDict nếu bạn lập trình với Python 2:

from collections import OrderedDict
str = list( OrderedDict.fromkeys(str) )
print str
# = ['a', 'b', 'c', 'd']

Từ phiên bản Python 3.6 trở lên, cấu trúc OrderedDict đã bị loại bỏ và thay vào đó bạn có thể sử dụng dict như bình thường:

str = list( dict.fromkeys(str) )
print(str)
# = ['a', 'b', 'c', 'd']
I'm not yours 11.10.2018

Bạn có thể giải thích thêm tại sao dict có thể làm được việc này và mục đích của hàm fromkeys() là gì không?

Therma 11.10.2018
1

Phương thức fromkeys() dùng để tạo ra một dict mới với giá trị input đầu vào là một mảng, mỗi phần tử trong dict chính là một cặp keyvalue.

print OrderedDict.fromkeys(str)
# = OrderedDict([('a', None), ('b', None), ('c', None), ('d', None)])

key là phần tử được tạo bởi mảng input đầu vào, value mặc định là None, dict hoạt động theo cơ chế là khi tạo mới một key, nó sẽ kiểm tra xem key đó đã có chưa, nếu có thì ghi đè giá trị value của key đó, nếu không, thực hiện tạo mới, do phần tử trong dict sẽ bị ghi đè nếu giống nhau nên không có việc trùng lắp phần tử trong dict được, lợi dụng điểm này ta có thể chuyển qua dict để xử lý sau đó chuyển ngược lại về list.

Bạn nên đọc docs từ trang chủ Python về dict và phương thức fromkeys để hiểu rõ hơn.

I'm not yours 11.10.2018
thêm bình luận...
0
Cộng đồng đã đăng:

Bạn có thể loại bỏ phần tử trùng nhau và giữ nguyên thứ tự mảng hoặc list ban đầu bằng cách dùng hàm dict.fromkeys() kết hợp với hàm list() nha. Ví dụ:

str = ['a', 'b', 'a', 'c', 'b', 'd', 'a', 'b']
unique_l=list(dict.fromkeys(l))
print(unique_l)
#>> ['a', 'b', 'c', 'd']

Tham khảo

  1. Hàm list() và cách tạo list từ iterable trong python
  2. Xóa phần tử trùng nhau trong list python
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)