Cấu trúc dữ liệu được sử dụng trong SET là Băm, một kỹ thuật phổ biến để thực hiện thao tác chèn, xóa và duyệt trung bình trong O[1]. Các thao tác trên Hash Table có phần giống với Linked List. Các bộ trong python là danh sách không có thứ tự với các phần tử trùng lặp đã bị xóa
Để tạo bảng băm từ đầu, chúng tôi bắt đầu với một số bộ nhớ được phân bổ, tương tự như những gì chúng tôi đã bắt đầu với mảng
Đối với một mảng, nếu chúng ta muốn chèn dữ liệu, chúng ta chỉ cần tìm nhóm nhỏ nhất chưa sử dụng và chèn dữ liệu của mình vào đó [và thay đổi kích thước nếu cần]
Đối với các bảng băm, trước tiên chúng ta phải tìm ra vị trí của dữ liệu trong đoạn bộ nhớ liền kề này
Vị trí của dữ liệu mới phụ thuộc vào hai thuộc tính của dữ liệu chúng tôi đang chèn. giá trị băm của khóa và cách so sánh giá trị với các đối tượng khác
Điều này là do khi chúng ta chèn dữ liệu, khóa đầu tiên được băm và ẩn để nó biến thành một chỉ mục hiệu quả trong một mảng
Mặt nạ đảm bảo rằng giá trị băm, có thể lấy giá trị của bất kỳ số nguyên nào, phù hợp với số lượng nhóm được phân bổ
Vì vậy, nếu chúng tôi đã phân bổ 8 khối bộ nhớ và giá trị băm của chúng tôi là 28975, thì chúng tôi coi bộ chứa ở chỉ mục
#use a loop to iteratre over the set7
for x in fruits:
print[x]#out:
cherry
apple
banana
Tuy nhiên, nếu từ điển của chúng ta đã phát triển để yêu cầu 512 khối bộ nhớ, thì mặt nạ sẽ trở thành
#use a loop to iteratre over the set8 [và trong trường hợp này, chúng ta sẽ xem xét nhóm ở chỉ mục
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set9]
for x in fruits:
print[x]#out:
cherry
apple
banana
Bây giờ chúng ta phải kiểm tra xem thùng này đã được sử dụng chưa. Nếu nó trống, chúng ta có thể chèn khóa và giá trị vào khối bộ nhớ này. Chúng tôi lưu trữ khóa để có thể đảm bảo rằng chúng tôi đang truy xuất đúng giá trị khi tra cứu. Nếu nó đang được sử dụng và giá trị của bộ chứa bằng với giá trị chúng tôi muốn chèn [so sánh được thực hiện với cmp tích hợp sẵn], thì cặp khóa/giá trị đã có trong bảng băm và chúng tôi có thể trả về. Tuy nhiên, nếu các giá trị không khớp nhau, thì chúng ta phải tìm một nơi mới để đặt dữ liệu
Tiếp theo từ Danh sách và Bộ dữ liệu, tập hợp là một cấu trúc dữ liệu phổ biến khác thường gặp trong Python và có nhiều cách sử dụng khác nhau trong quy trình làm việc. Chúng có thể được sử dụng để lưu trữ nhiều mục trong một biến như danh sách hoặc bộ nhưng điểm khác biệt chính là chúng không có thứ tự và không thể chứa các giá trị trùng lặp. Điều này có nghĩa là chúng có thể hữu ích khi bạn chỉ muốn lưu trữ các giá trị duy nhất, không quan tâm đến việc duy trì thứ tự của các mục trong cấu trúc dữ liệu hoặc bạn muốn kiểm tra sự trùng lặp và khác biệt giữa các nguồn dữ liệu khác nhau. Các đặc điểm chính của cấu trúc dữ liệu này là
- có thể thay đổi. Chúng có thể được thay đổi sau khi Bộ đã được tạo
- không có thứ tự. Thứ tự của các mục trong một bộ không được ghi lại hoặc lưu giữ
- Đã hủy lập chỉ mục. Vì chúng không có thứ tự nên chúng tôi không có chỉ mục mà chúng tôi có thể sử dụng để truy cập các mục cụ thể
- Không thể chứa các giá trị trùng lặp. Các bộ không cho phép bạn chứa nhiều phiên bản có cùng giá trị
Những đặc điểm này sau đó ảnh hưởng đến cách chúng có thể được sử dụng trong chương trình của bạn. Chẳng hạn, bạn sẽ không muốn sử dụng chúng khi bạn muốn duy trì thứ tự mà bạn thêm các mục vào tập hợp, nhưng bạn có thể muốn sử dụng chúng khi bạn chỉ quan tâm đến việc thêm các mục duy nhất và muốn tiết kiệm dung lượng trong bộ nhớ
Thực hiện
Để tạo một tập hợp, chúng ta có thể sử dụng hai phương pháp chính
- Sử dụng
#use a loop to iteratre over the set
0 để đính kèm một nhóm các mục được phân tách bằng dấu phẩy mà chúng tôi muốn đưa vào tập hợp
for x in fruits:
print[x]#out:
cherry
apple
banana - Sử dụng hàm
#use a loop to iteratre over the set
0 có thể được sử dụng để chuyển đổi các cấu trúc dữ liệu khác thành một tập hợp
for x in fruits:
print[x]#out:
cherry
apple
banana
Điều này có thể được thực hiện như
#create a set using curly brackets
fruits = {"apple", "banana", "cherry"}#create a set using the set constructor
vegetables = set[["courgette", "potato", "aubergine"]]#print the results
print[fruits]
print[type[fruits]]print["\n"]print[vegetables]
print[type[vegetables]]#out:
{'apple', 'banana', 'cherry'}
{'aubergine', 'courgette', 'potato'}
Từ điều này, chúng ta có thể thấy rằng mặc dù chúng ta có thể sử dụng ký hiệu
#use a loop to iteratre over the set0 để tạo một tập hợp từ các đầu vào thô được phân tách bằng dấu phẩy, nhưng chúng ta đã sử dụng hàm
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set0 để thay đổi một bộ thành một tập hợp cho thấy rằng chúng ta cũng có thể thay đổi các cấu trúc dữ liệu khác thành các tập hợp
for x in fruits:
print[x]#out:
cherry
apple
banana
Ta cũng có thể thấy rằng khi in bộ sản phẩm không nhất thiết phải xuất hiện theo thứ tự như khi nhập dữ liệu [cụ thể là bộ rau củ quả]. Điều này liên quan đến thực tế rằng nó là một cấu trúc dữ liệu không có thứ tự nên các mục sẽ không luôn xuất hiện theo cùng một thứ tự và vì vậy chúng tôi không thể truy cập các mục theo cách giống như cách chúng tôi làm với một danh sách
Truy cập các mục trong một bộ
Bởi vì các mục trong một bộ không có thứ tự nên chúng tôi không có chỉ mục cho các mục, vì vậy chúng tôi không thể truy cập chúng giống như cách chúng tôi làm với danh sách hoặc bộ. Do đó, có hai cách chính để kiểm tra xem một mục có nằm trong bộ hay không
Cách thứ nhất chỉ đơn giản là lặp qua tất cả các mục trong một bộ để in tất cả các mục, sau đó kiểm tra chúng và/hoặc thực hiện một giải pháp có lập trình để dừng khi mục mong muốn đã được xác định. Điều này có thể được thực hiện như sau
#use a loop to iteratre over the set
for x in fruits:
print[x]#out:
cherry
apple
banana
Việc này có thể tốn nhiều công sức tính toán và nếu bạn phải kiểm tra tất cả các giá trị bằng mắt thì việc này có thể mất nhiều thời gian nếu bạn có một tập hợp rất lớn
Sau đó, cách khác là chỉ cần sử dụng từ khóa
#use a loop to iteratre over the set3 trong python để kiểm tra xem giá trị bạn quan tâm có thực sự nằm trong tập hợp hay không. Điều này có thể được thực hiện như
for x in fruits:
print[x]#out:
cherry
apple
banana
#or check whether the fruit you want is in the set
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
Mà trong trường hợp này trả về
#use a loop to iteratre over the set4 dưới dạng “quả táo” nằm trong tập hợp. Điều này làm cho cuộc sống dễ dàng hơn rất nhiều và tiết kiệm tài nguyên tính toán hơn là lặp qua toàn bộ tập hợp và do đó có thể được sử dụng để kích hoạt các đoạn mã khác bằng câu lệnh if, elif hoặc other chẳng hạn
for x in fruits:
print[x]#out:
cherry
apple
banana
khả năng biến đổi
Mặc dù các bộ có thể thay đổi được vì chúng có thể được thay đổi, nhưng các giá trị thực tế trong bộ không thể. Điều này có nghĩa là mặc dù bạn có thể thêm hoặc xóa các mục trong bộ, nhưng bạn không thể thay đổi các mục cụ thể vì chúng tôi không thể truy cập các mục thông qua chỉ mục của chúng
Do đó, chúng ta có thể thay đổi tập hợp bằng một số phương pháp khác nhau. Trước tiên chúng ta có thể tập trung vào việc thêm các mục vào bộ hiện có. Cách đầu tiên để làm điều này là sử dụng phương pháp
#use a loop to iteratre over the set5 có thể được sử dụng để thêm các mục cụ thể vào tập hợp. Cách thứ hai là sử dụng phương pháp
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set6 có thể được sử dụng để thêm một tập hợp khác vào một tập hợp hiện có. Cuối cùng, chúng ta cũng có thể sử dụng phương thức
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set6 để thêm bất kỳ đối tượng có thể lặp lại nào vào tập hợp, chẳng hạn như bộ dữ liệu hoặc danh sách, nhưng điều này sẽ chỉ giữ lại các giá trị duy nhất. Chúng có thể được thực hiện như
for x in fruits:
print[x]#out:
cherry
apple
banana
#create a set using curly brackets0
fruits = {"apple", "banana", "cherry"}#create a set using the set constructor
vegetables = set[["courgette", "potato", "aubergine"]]#print the results
print[fruits]
print[type[fruits]]print["\n"]print[vegetables]
print[type[vegetables]]#out:
{'apple', 'banana', 'cherry'}
{'aubergine', 'courgette', 'potato'}
Mặt khác, chúng tôi cũng có thể xóa các mục khỏi bộ nếu chúng tôi không còn muốn chúng ở đó nữa. Đối với điều này, chúng ta có thể sử dụng phương pháp
#use a loop to iteratre over the set8 để xóa một giá trị cụ thể khỏi một tập hợp. Tuy nhiên, vấn đề với điều này là nếu mục không tồn tại trong tập hợp thì điều này sẽ gây ra lỗi và ngăn mã của bạn chạy. Do đó, chúng tôi cũng có thể sử dụng phương pháp
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set9 sẽ không gây ra lỗi và do đó sẽ cho phép mã tiếp tục. Tất nhiên, việc lựa chọn những thứ này sẽ phụ thuộc vào việc bạn có muốn các hành động cụ thể xảy ra nếu mục đó có trong bộ hay không. Cuối cùng, chúng ta cũng có thể sử dụng phương pháp
for x in fruits:
print[x]#out:
cherry
apple
banana
#or check whether the fruit you want is in the set0, nhưng vì tập hợp không có thứ tự nên chúng ta không biết mục nào sẽ thực sự bị xóa
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#create a set using curly brackets4
fruits = {"apple", "banana", "cherry"}#create a set using the set constructor
vegetables = set[["courgette", "potato", "aubergine"]]#print the results
print[fruits]
print[type[fruits]]print["\n"]print[vegetables]
print[type[vegetables]]#out:
{'apple', 'banana', 'cherry'}
{'aubergine', 'courgette', 'potato'}
Chúng tôi cũng đã đưa vào phương thức
#or check whether the fruit you want is in the set1 để có thể xóa hoàn toàn tập hợp nếu bạn muốn hoặc hàm
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#or check whether the fruit you want is in the set2 xóa hoàn toàn tập hợp
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
Chức năng bổ sung
Một yếu tố khác biệt quan trọng giữa các tập hợp và các cấu trúc dữ liệu khác là chúng không thể chứa các giá trị trùng lặp. Điều này có lợi chẳng hạn khi chúng tôi muốn giảm thiểu dung lượng chiếm dụng bởi thông tin, chúng tôi không muốn trùng lặp hoặc chúng tôi muốn tìm các giá trị duy nhất có trong thông tin. Ví dụ: nếu chúng tôi muốn thêm các giá trị trùng lặp vào danh sách và sau đó chỉ trích xuất các giá trị duy nhất, chúng tôi có thể sử dụng tập hợp làm
#create a set using curly brackets7
fruits = {"apple", "banana", "cherry"}#create a set using the set constructor
vegetables = set[["courgette", "potato", "aubergine"]]#print the results
print[fruits]
print[type[fruits]]print["\n"]print[vegetables]
print[type[vegetables]]#out:
{'apple', 'banana', 'cherry'}
{'aubergine', 'courgette', 'potato'}
Tập hợp sẽ chỉ chứa các giá trị riêng lẻ từ các mục được chuyển
Điều này có ý nghĩa quan trọng khi chúng ta muốn nối hai tập hợp lại với nhau và có nhiều phương pháp để làm như vậy. Ví dụ: nếu chúng tôi muốn hợp nhất các tập hợp và giữ tất cả các giá trị duy nhất từ mỗi tập hợp, chúng tôi có thể sử dụng phương pháp
#or check whether the fruit you want is in the set3 để tạo một tập hợp mới hoặc chúng tôi có thể sử dụng phương thức
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#use a loop to iteratre over the set6 để thay đổi một tập hợp hiện có như sau
for x in fruits:
print[x]#out:
cherry
apple
banana
#use a loop to iteratre over the set0
for x in fruits:
print[x]#out:
cherry
apple
banana
Một cách khác là chỉ giữ các bản sao xuất hiện trong cả hai bộ, có thể thực hiện bằng phương pháp
#or check whether the fruit you want is in the set5 nếu chúng tôi muốn tạo một bộ mới hoặc phương pháp
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#or check whether the fruit you want is in the set6 nếu chúng tôi muốn cập nhật một et hiện có như sau
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#use a loop to iteratre over the set3
for x in fruits:
print[x]#out:
cherry
apple
banana
Hoặc cuối cùng, chúng ta có thể làm ngược lại điều này và trích xuất bất kỳ thứ gì ngoại trừ sao chép các giá trị duy nhất cho mỗi tập hợp. Điều này có thể được thực hiện bằng cách sử dụng phương pháp
#or check whether the fruit you want is in the set7 khi chúng tôi muốn tạo một bộ mới hoặc phương pháp
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#or check whether the fruit you want is in the set8 nếu chúng tôi muốn cập nhật một bộ hiện có
print["apple" in fruits]
#which acts the same way as if it were in a list#out:
True
#use a loop to iteratre over the set6
for x in fruits:
print[x]#out:
cherry
apple
banana
Vì vậy, một hướng dẫn đầy đủ về các bộ trong Python. Từ đó, chúng ta có thể thấy rằng các bộ không có thứ tự, không được lập chỉ mục và không cho phép các giá trị trùng lặp. Cái sau là một đặc điểm quan trọng vì chúng có thể được sử dụng khi chúng ta chỉ muốn trích xuất các mục duy nhất từ một thứ gì đó, thay vì có nhiều phiên bản của chúng, nhưng không thể được sử dụng khi chúng ta muốn giữ lại một thứ tự nhất định trong tập dữ liệu
Đây là bài viết thứ hai trong loạt bài khám phá Cấu trúc dữ liệu, cách sử dụng và triển khai chúng trong Python. Nếu bạn bỏ lỡ phần đầu tiên trên Danh sách trong Python, bạn có thể tìm thấy phần này tại các liên kết sau
Hướng dẫn đầy đủ về danh sách trong Python
Các tính năng chính, triển khai, lập chỉ mục, cắt, định vị một mục, khả năng thay đổi và các chức năng hữu ích khác
hướng tới khoa học dữ liệu. com
Các bài đăng trong tương lai sẽ đề cập đến từ điển, danh sách được liên kết, ngăn xếp, hàng đợi và biểu đồ trong Python. Để đảm bảo bạn không bỏ lỡ bất kỳ điều gì trong tương lai, hãy đăng ký để nhận thông báo qua email khi chúng được xuất bản
Nhận email bất cứ khi nào Philip Wilkinson xuất bản
Nhận email bất cứ khi nào Philip Wilkinson xuất bản. Bằng cách đăng ký, bạn sẽ tạo một tài khoản Medium nếu bạn chưa có…
philip-wilkinson. vừa phải. com
Và nếu bạn thích những gì bạn đọc và chưa phải là thành viên trung bình, hãy xem xét hỗ trợ cả tôi và cùng các tác giả tuyệt vời trên nền tảng này bằng cách đăng ký bằng mã giới thiệu của tôi bên dưới