Tìm các phần tử giống nhau trong 3 tập hợp python

List là một danh sách được sử dụng để lưu trữ nhiều mục trong một biến duy nhất. List là một trong 4 kiểu dữ liệu tích hợp sẵn trong Python được sử dụng để lưu trữ các bộ sưu tập dữ liệu, 3 kiểu còn lại là Tuple, Set và Dictionary,và cách sử dụng khác nhau.

List được tạo bằng dấu ngoặc vuông: [ ]

ví dụ:
Tạo một list [Create a list] mylist = ["apple", "banana", "cherry"] print[mylist] # Hoặc bằng phương thức List_1 = list[["apple", "banana", "cherry"]] print[List_1]

Các mục trong list [List items]

Các phần tử [các mục] trong list được sắp xếp theo thứ tự, có thể thay đổi và cho phép các giá trị trùng lặp. Các mục trong list được lập chỉ mục, mục đầu tiên có chỉ mục [0], mục thứ hai có chỉ mục [1], v.v. Khi các phần tử trong list được sắp xếp theo thứ tự, điều đó có nghĩa là các phần tử đó có thứ tự xác định và thứ tự đó sẽ không thay đổi. Nếu ta muốn thêm các phần tử mới vào list, các phần tử đó sẽ được đặt ở cuối list.

Lưu ý: Có một số phương pháp list sẽ thay đổi thứ tự, nhưng nói chung: thứ tự của các mục sẽ không thay đổi.

thislist = ["apple", "banana", "cherry"] print[thislist] # lập chỉ mục[index] # thislist[0] giá trị là "apple", thislist[1] có giá trị là "banana", thislist[2] có giá trị là "cherry"

List có thể thay đổi được

List có thể thay đổi, nghĩa là chúng ta có thể thay đổi, thêm và xóa các mục trong danh sách sau khi nó đã được tạo.

list3 = list[["apple", "banana", "cherry"]] # kiểu dữ liệu dạng tuple list3[0] = "kiwi" list3.append["orange"] print[list3] # KQ ['kiwi', 'banana', 'cherry', 'orange']

List cho phép các phần tử được trùng nhau [Duplicates]

Vì danh sách được lập chỉ mục nên danh sách có thể có các mục có cùng giá trị:

thislist = ["apple", "banana", "cherry", "apple", "cherry"] print[thislist] # ta thấy các phần tử trong list trên có thể giống nhau đó là "apple"

Độ dài của list [List Length]

Để xác định list có bao nhiêu phần tử, ta sử dụng hàm len []:

mylist = ["apple", "banana", "cherry"] print[len[mylist]] # kết quả trả về là 3 phần tử trong list

Loại dữ liệu của list [Data types]

Các phần tử trong list có thể thuộc bất kỳ kiểu dữ liệu nào:

Ví dụ: list1 = ["apple", "banana", "cherry"] list2 = [1, 5, 7, 9, 3] list3 = [True, False, False]

Một danh sách có thể chứa các kiểu dữ liệu khác nhau:

list1 = ["abc", 34, True, 40, "male"]

List có thể lồng trong list

List1 = list[[23,[5,7,43]]] print[List_1] # Kết quả: [23,[5,7,43]]

Dùng phương thức list[] để đưa kiểu dữ liệu tập hợp [Tuple, set, Dict] về dạng list

list1 = list[{"apple": 3, "banana":5, "cherry":4}] # kiểu dữ liệu dạng dict list2 = list[{"apple", "banana", "cherry"}] # kiểu dữ liệu dạng set list3 = list[["apple", "banana", "cherry"]] # kiểu dữ liệu dạng tuple print[list1] # KQ ['apple', 'banana', 'cherry'] print[list2] # KQ ['apple', 'banana', 'cherry'] print[list3] # KQ ['apple', 'banana', 'cherry']

Phần này mô tả cách tạo một danh sách mới trong Python bằng cách loại bỏ hoặc trích xuất các phần tử trùng lặp từ một danh sách [mảng].

Các chi tiết sau đây được mô tả ở đây.

  • Loại bỏ các yếu tố trùng lặp và tạo danh sách mới
    • Không bảo tồn thứ tự của danh sách ban đầu:set[]
    • Duy trì thứ tự của danh sách ban đầu:dict.fromkeys[],sorted[]
    • Mảng hai chiều [danh sách các danh sách]
  • Trích xuất các phần tử trùng lặp và tạo một danh sách mới
    • Không bảo tồn thứ tự của danh sách ban đầu
    • Duy trì thứ tự của danh sách ban đầu
    • Mảng hai chiều [danh sách các danh sách]

Khái niệm tương tự có thể được áp dụng cho các bộ giá trị thay vì danh sách.

Xem bài viết sau để biết

  • Nếu bạn muốn xác định xem một danh sách hoặc bộ dữ liệu có các phần tử trùng lặp hay không
  • Nếu bạn muốn trích xuất các yếu tố phổ biến hoặc không phổ biến giữa nhiều danh sách thay vì một 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.

Loại bỏ các yếu tố trùng lặp và tạo danh sách mới

Không bảo tồn thứ tự của danh sách ban đầu:set[]

Nếu không cần thiết phải bảo toàn thứ tự của danh sách ban đầu, hãy sử dụng set [], tạo ra một tập hợp 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 hoặc kiểu dữ liệu khác được chuyển đến set [], các giá trị trùng lặp sẽ bị bỏ qua và một đối tượng của kiểu set được trả về trong đó chỉ các giá trị duy nhất là phần tử.

Nếu bạn muốn biến nó thành một tuple, hãy sử dụng tuple [].

l = [3, 3, 2, 1, 5, 1, 4, 2, 3] print[set[l]] # {1, 2, 3, 4, 5} print[list[set[l]]] # [1, 2, 3, 4, 5]

Tất nhiên, nó cũng có thể được để nguyên. Xem bài viết sau để biết thêm thông tin về loại set set.

Duy trì thứ tự của danh sách ban đầu:dict.fromkeys[],sorted[]

Nếu bạn muốn giữ nguyên thứ tự của danh sách ban đầu, hãy sử dụng phương thức lớp fromkeys [] của kiểu từ điển hoặc hàm sorted [] tích hợp sẵn.

dict.fromkeys [] tạo một đối tượng từ điển mới có khóa là danh sách, bộ giá trị, v.v. được chỉ định trong các đối số. Nếu đối số thứ hai bị bỏ qua, giá trị là Không có.

Vì các khóa từ điển không có các phần tử trùng lặp, các giá trị trùng lặp sẽ bị bỏ qua như trong set []. Ngoài ra, một đối tượng từ điển có thể được chuyển làm đối số cho list [] để lấy danh sách có các phần tử là khóa từ điển.

print[dict.fromkeys[l]] # {3: None, 2: None, 1: None, 5: None, 4: None} print[list[dict.fromkeys[l]]] # [3, 2, 1, 5, 4]

Nó đã được đảm bảo kể từ Python 3.7 [CPython là 3.6] rằng dict.fromkeys [] bảo toàn thứ tự của chuỗi đối số. Các phiên bản trước sử dụng hàm sorted [] tích hợp sẵn như sau.

Chỉ định danh sách phương thức tuple index [] cho khóa đối số của đã sắp xếp, nó trả về một danh sách các phần tử đã được sắp xếp.

index [] là một phương thức trả về chỉ số của giá trị [số phần tử trong danh sách], có thể được chỉ định làm khóa của sorted [] để sắp xếp danh sách dựa trên thứ tự của danh sách ban đầu. Khóa đối số được chỉ định là một đối tượng có thể gọi [callable], do đó, không viết [].

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

Mảng hai chiều [danh sách các danh sách]

Đối với mảng hai chiều [danh sách các danh sách], phương thức sử dụng set [] hoặc dict.fromkeys [] dẫn đến Lỗi kiểu.

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]] # l_2d_unique = list[set[l_2d]] # TypeError: unhashable type: 'list' # l_2d_unique_order = dict.fromkeys[l_2d] # TypeError: unhashable type: 'list'

Điều này là do các đối tượng không thể băm như danh sách không thể là phần tử của tập hợp kiểu hoặc các khóa thuộc kiểu dict.

Xác định các chức năng sau Thứ tự của danh sách ban đầu được giữ nguyên và hoạt động đối với danh sách một chiều và bộ giá trị.

def get_unique_list[seq]: seen = [] return [x for x in seq if x not in seen and not seen.append[x]] print[get_unique_list[l_2d]] # [[1, 1], [0, 1], [0, 0], [1, 0]] print[get_unique_list[l]] # [3, 2, 1, 5, 4]

Ký hiệu đọc hiểu danh sách được sử dụng.

  • CÓ LIÊN QUAN:Cách sử dụng hiểu danh sách Python

Ở đây, chúng tôi sử dụng những thứ sau

  • Nếu X trong “X và Y” là sai trong đánh giá ngắn mạch của toán tử và, thì Y không được đánh giá [không được thực thi].
  • Phương thức append [] trả về Không có.

Nếu các phần tử của danh sách ban đầu seq không tồn tại trong cái nhìn thấy, thì và sau đó được đánh giá.see.append [x] được thực thi và phần tử được thêm vào saw.Bởi vì phương thức append [] trả về None và None là False, nên không nhìn thấy .append [x] đánh giá là True.

Biểu thức điều kiện trong ký hiệu hiểu danh sách trở thành True và được thêm vào như một phần tử của danh sách được tạo cuối cùng.

Nếu các phần tử của danh sách ban đầu seq có mặt trong see, thì x không có trong saw là Sai và biểu thức điều kiện cho biểu thức hiểu danh sách là Sai.
Do đó, chúng không được thêm vào dưới dạng các phần tử của danh sách được tạo cuối cùng.

Một phương pháp khác là đặt trục đối số trong hàm np.unique [] của NumPy, mặc dù kết quả sẽ được sắp xếp.

Trích xuất các phần tử trùng lặp và tạo một danh sách mới

Không bảo tồn thứ tự của danh sách ban đầu

Để chỉ trích xuất các phần tử trùng lặp từ danh sách ban đầu, hãy sử dụng collection.Counter [].
Trả về một bộ sưu tập.Counter [một lớp con của từ điển] với các phần tử là khóa và số phần tử là giá trị.

import collections l = [3, 3, 2, 1, 5, 1, 4, 2, 3] print[collections.Counter[l]] # Counter[{3: 3, 2: 2, 1: 2, 5: 1, 4: 1}]

Vì nó là một lớp con của từ điển, các mục [] có thể được sử dụng để truy xuất các khóa và giá trị. Chỉ cần trích xuất các khóa có số lượng là hai hoặc nhiều hơn.

  • CÓ LIÊN QUAN:Từ điển Python [dict] để xử lý vòng lặp [khóa, giá trị, mục]
print[[k for k, v in collections.Counter[l].items[] if v > 1]] # [3, 2, 1]

Duy trì thứ tự của danh sách ban đầu

Như thể hiện trong ví dụ trên, kể từ Python 3.7, các khóa của bộ sưu tập.Counter giữ nguyên thứ tự của danh sách ban đầu, v.v.

Trong các phiên bản trước, sắp xếp với sorted [] là đủ, cũng như xóa các phần tử trùng lặp.

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

Nếu bạn muốn trích xuất các bản sao như chúng vốn có, chỉ cần để lại các phần tử từ danh sách ban đầu với số lượng hai hoặc nhiều hơn. Thứ tự cũng được giữ nguyên.

cc = collections.Counter[l] print[[x for x in l if cc[x] > 1]] # [3, 3, 2, 1, 1, 2, 3]

Mảng hai chiều [danh sách các danh sách]

Đối với mảng hai chiều [danh sách các danh sách], các chức năng sau đây khả thi khi thứ tự của danh sách ban đầu không được giữ lại và khi nó được giữ lại tương ứng. Nó cũng hoạt động cho các danh sách một chiều và các bộ giá trị.

l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]] def get_duplicate_list[seq]: seen = [] return [x for x in seq if not seen.append[x] and seen.count[x] == 2] def get_duplicate_list_order[seq]: seen = [] return [x for x in seq if seq.count[x] > 1 and not seen.append[x] and seen.count[x] == 1] print[get_duplicate_list[l_2d]] # [[0, 1], [1, 1]] print[get_duplicate_list_order[l_2d]] # [[1, 1], [0, 1]] print[get_duplicate_list[l]] # [3, 1, 2] print[get_duplicate_list_order[l]] # [3, 2, 1]

Nếu bạn muốn trích xuất với các bản sao, hãy để các phần tử từ danh sách ban đầu với số lượng là hai hoặc nhiều hơn.

print[[x for x in l_2d if l_2d.count[x] > 1]] # [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]

Lưu ý rằng vì độ phức tạp tính toán của count [] là O [n], hàm hiển thị ở trên thực hiện lặp đi lặp lại count [] là rất kém hiệu quả. Có thể có một cách thông minh hơn.

Bộ đếm là một lớp con của từ điển, vì vậy nếu bạn chuyển một danh sách hoặc bộ mã có các phần tử là danh sách hoặc các đối tượng không thể băm khác vào bộ sưu tập.Counter [], một lỗi sẽ xảy ra và bạn sẽ không thể sử dụng nó.

# print[collections.Counter[l_2d]] # TypeError: unhashable type: 'list'

Video liên quan

Chủ Đề