Python hướng đối tượng - Cấu trúc dữ liệu

Các cấu trúc dữ liệu Python rất trực quan theo quan điểm cú pháp và chúng cung cấp nhiều lựa chọn hoạt động. Bạn cần chọn cấu trúc dữ liệu Python tùy thuộc vào những gì dữ liệu liên quan, nếu nó cần được sửa đổi hoặc nếu nó là một dữ liệu cố định và loại truy cập nào được yêu cầu, chẳng hạn như ở đầu / cuối / ngẫu nhiên, v.v.

Danh sách

Danh sách đại diện cho kiểu cấu trúc dữ liệu linh hoạt nhất trong Python. Danh sách là một vùng chứa chứa các giá trị được phân tách bằng dấu phẩy (các mục hoặc phần tử) giữa các dấu ngoặc vuông. Danh sách rất hữu ích khi chúng ta muốn làm việc với nhiều giá trị có liên quan. Khi danh sách giữ dữ liệu cùng nhau, chúng ta có thể thực hiện các phương pháp và thao tác giống nhau trên nhiều giá trị cùng một lúc. Các chỉ mục của danh sách bắt đầu từ 0 và không giống như chuỗi, danh sách có thể thay đổi được.

Cấu trúc dữ liệu - Danh sách

>>>
>>> # Any Empty List
>>> empty_list = []
>>>
>>> # A list of String
>>> str_list = ['Life', 'Is', 'Beautiful']
>>> # A list of Integers
>>> int_list = [1, 4, 5, 9, 18]
>>>
>>> #Mixed items list
>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>> # To print the list
>>>
>>> print(empty_list)
[]
>>> print(str_list)
['Life', 'Is', 'Beautiful']
>>> print(type(str_list))
<class 'list'>
>>> print(int_list)
[1, 4, 5, 9, 18]
>>> print(mixed_list)
['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']

Truy cập các mục trong danh sách Python

Mỗi mục của danh sách được gán một số - đó là chỉ số hoặc vị trí của số đó. Lập chỉ mục luôn bắt đầu từ số 0, chỉ mục thứ hai là một, v.v. Để truy cập các mục trong danh sách, chúng ta có thể sử dụng các số chỉ mục này trong dấu ngoặc vuông. Hãy quan sát đoạn mã sau để làm ví dụ:

>>> mixed_list = ['This', 9, 'is', 18, 45.9, 'a', 54, 'mixed', 99, 'list']
>>>
>>> # To access the First Item of the list
>>> mixed_list[0]
'This'
>>> # To access the 4th item
>>> mixed_list[3]
18
>>> # To access the last item of the list
>>> mixed_list[-1]
'list'

Đối tượng rỗng

Đối tượng rỗng là kiểu tích hợp sẵn trong Python đơn giản và cơ bản nhất. Chúng tôi đã sử dụng chúng nhiều lần mà không nhận thấy và đã mở rộng nó cho mọi lớp chúng tôi đã tạo. Mục đích chính để viết một lớp trống là để chặn một cái gì đó trong thời gian này và sau đó sẽ mở rộng và thêm một hành vi vào nó.

Để thêm một hành vi vào một lớp có nghĩa là thay thế một cấu trúc dữ liệu bằng một đối tượng và thay đổi tất cả các tham chiếu đến nó. Vì vậy, điều quan trọng là phải kiểm tra dữ liệu, liệu nó có phải là một đối tượng ngụy trang hay không, trước khi bạn tạo bất cứ thứ gì. Hãy quan sát đoạn mã sau để hiểu rõ hơn:

>>> #Empty objects
>>>
>>> obj = object()
>>> obj.x = 9
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
obj.x = 9
AttributeError: 'object' object has no attribute 'x'

Vì vậy, từ phía trên, chúng ta có thể thấy rằng không thể thiết lập bất kỳ thuộc tính nào trên một đối tượng đã được khởi tạo trực tiếp. Khi Python cho phép một đối tượng có các thuộc tính tùy ý, cần một lượng bộ nhớ hệ thống nhất định để theo dõi các thuộc tính mà mỗi đối tượng có, để lưu trữ cả tên thuộc tính và giá trị của nó. Ngay cả khi không có thuộc tính nào được lưu trữ, một lượng bộ nhớ nhất định sẽ được cấp cho các thuộc tính mới tiềm năng.

Vì vậy, Python vô hiệu hóa các thuộc tính tùy ý trên đối tượng và một số cài sẵn khác, theo mặc định.

>>> # Empty Objects
>>>
>>> class EmpObject:
    pass
>>> obj = EmpObject()
>>> obj.x = 'Hello, World!'
>>> obj.x
'Hello, World!'

Do đó, nếu chúng ta muốn nhóm các thuộc tính lại với nhau, chúng ta có thể lưu trữ chúng trong một đối tượng trống như được hiển thị trong đoạn mã trên. Tuy nhiên, phương pháp này không phải lúc nào cũng được gợi ý. Hãy nhớ rằng các lớp và đối tượng chỉ nên được sử dụng khi bạn muốn chỉ định cả dữ liệu và hành vi.

Tuples

Tuples tương tự như danh sách và có thể lưu trữ các phần tử. Tuy nhiên, chúng là bất biến, vì vậy chúng ta không thể thêm, bớt hoặc thay thế các đối tượng. Lợi ích chính mà tuple mang lại vì tính bất biến của nó là chúng ta có thể sử dụng chúng làm khóa trong từ điển hoặc ở các vị trí khác nơi một đối tượng yêu cầu giá trị băm.

Tuples được sử dụng để lưu trữ dữ liệu chứ không phải hành vi. Trong trường hợp bạn yêu cầu hành vi để thao tác một tuple, bạn cần truyền tuple vào một hàm (hoặc phương thức trên một đối tượng khác) thực hiện hành động.

Vì tuple có thể hoạt động như một khóa từ điển, các giá trị được lưu trữ là khác nhau. Chúng ta có thể tạo một bộ giá trị bằng cách phân tách các giá trị bằng dấu phẩy. Các bộ giá trị được gói trong ngoặc đơn nhưng không bắt buộc. Đoạn mã sau đây hiển thị hai nhiệm vụ giống hệt nhau.

>>> stock1 = 'MSFT', 95.00, 97.45, 92.45
>>> stock2 = ('MSFT', 95.00, 97.45, 92.45)
>>> type (stock1)
<class 'tuple'>
>>> type(stock2)
<class 'tuple'>
>>> stock1 == stock2
True
>>>

Định nghĩa một Tuple

Các bộ dữ liệu rất giống với danh sách ngoại trừ việc toàn bộ tập hợp các phần tử được đặt trong dấu ngoặc đơn thay vì dấu ngoặc vuông.

Giống như khi bạn cắt một danh sách, bạn sẽ có một danh sách mới và khi bạn cắt một bộ, bạn sẽ có một bộ mới.

>>> tupl = ('Tuple','is', 'an','IMMUTABLE', 'list')
>>> tupl
('Tuple', 'is', 'an', 'IMMUTABLE', 'list')
>>> tupl[0]
'Tuple'
>>> tupl[-1]
'list'
>>> tupl[1:3]
('is', 'an')

Phương thức Tuple trong Python

Đoạn mã sau hiển thị các phương thức trong bộ dữ liệu Python:

>>> tupl
('Tuple', 'is', 'an', 'IMMUTABLE', 'list')
>>> tupl.append('new')
Traceback (most recent call last):
   File "<pyshell#148>", line 1, in <module>
      tupl.append('new')
AttributeError: 'tuple' object has no attribute 'append'
>>> tupl.remove('is')
Traceback (most recent call last):
   File "<pyshell#149>", line 1, in <module>
      tupl.remove('is')
AttributeError: 'tuple' object has no attribute 'remove'
>>> tupl.index('list')
4
>>> tupl.index('new')
Traceback (most recent call last):
   File "<pyshell#151>", line 1, in <module>
      tupl.index('new')
ValueError: tuple.index(x): x not in tuple
>>> "is" in tupl
True
>>> tupl.count('is')
1

Từ đoạn mã được hiển thị ở trên, chúng ta có thể hiểu rằng các bộ giá trị là bất biến và do đó -

  • Bạn cannot thêm các phần tử vào một tuple.

  • Bạn cannot nối hoặc mở rộng một phương thức.

  • Bạn cannot loại bỏ các phần tử khỏi một tuple.

  • Tuples có no loại bỏ hoặc phương thức bật.

  • Đếm và chỉ mục là các phương thức có sẵn trong một bộ.

Từ điển

Từ điển là một trong những kiểu dữ liệu tích hợp của Python và nó xác định mối quan hệ 1-1 giữa các khóa và giá trị.

Định nghĩa từ điển

Quan sát đoạn mã sau để hiểu về cách xác định từ điển -

>>> # empty dictionary
>>> my_dict = {}
>>>
>>> # dictionary with integer keys
>>> my_dict = { 1:'msft', 2: 'IT'}
>>>
>>> # dictionary with mixed keys
>>> my_dict = {'name': 'Aarav', 1: [ 2, 4, 10]}
>>>
>>> # using built-in function dict()
>>> my_dict = dict({1:'msft', 2:'IT'})
>>>
>>> # From sequence having each item as a pair
>>> my_dict = dict([(1,'msft'), (2,'IT')])
>>>
>>> # Accessing elements of a dictionary
>>> my_dict[1]
'msft'
>>> my_dict[2]
'IT'
>>> my_dict['IT']
Traceback (most recent call last):
   File "<pyshell#177>", line 1, in <module>
   my_dict['IT']
KeyError: 'IT'
>>>

Từ đoạn mã trên, chúng ta có thể thấy rằng:

  • Đầu tiên, chúng tôi tạo một từ điển có hai phần tử và gán nó cho biến my_dict. Mỗi phần tử là một cặp khóa-giá trị và toàn bộ tập hợp các phần tử được đặt trong dấu ngoặc nhọn.

  • Con số 1 là chìa khóa và msftlà giá trị của nó. Tương tự,2 là chìa khóa và IT là giá trị của nó.

  • Bạn có thể nhận giá trị theo khóa, nhưng không thể ngược lại. Vì vậy, khi chúng tôi cố gắngmy_dict[‘IT’] , nó đưa ra một ngoại lệ, bởi vì IT không phải là một chìa khóa.

Sửa đổi từ điển

Quan sát đoạn mã sau để hiểu về cách sửa đổi từ điển -

>>> # Modifying a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'IT'}
>>> my_dict[2] = 'Software'
>>> my_dict
{1: 'msft', 2: 'Software'}
>>>
>>> my_dict[3] = 'Microsoft Technologies'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'}

Từ đoạn mã trên, chúng ta có thể thấy rằng -

  • Bạn không thể có các khóa trùng lặp trong từ điển. Thay đổi giá trị của khóa hiện có sẽ xóa giá trị cũ.

  • Bạn có thể thêm các cặp khóa-giá trị mới bất kỳ lúc nào.

  • Từ điển không có khái niệm về thứ tự giữa các yếu tố. Chúng là những bộ sưu tập đơn giản không có thứ tự.

Trộn các loại dữ liệu trong một từ điển

Quan sát đoạn mã sau để hiểu về cách trộn các kiểu dữ liệu trong từ điển -

>>> # Mixing Data Types in a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies'}
>>> my_dict[4] = 'Operating System'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'}
>>> my_dict['Bill Gates'] = 'Owner'
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System',
'Bill Gates': 'Owner'}

Từ đoạn mã trên, chúng ta có thể thấy rằng -

  • Không chỉ chuỗi mà giá trị từ điển có thể thuộc bất kỳ kiểu dữ liệu nào bao gồm chuỗi, số nguyên, kể cả chính từ điển.

  • Không giống như giá trị từ điển, khóa từ điển bị hạn chế hơn, nhưng có thể thuộc bất kỳ loại nào như chuỗi, số nguyên hoặc bất kỳ loại nào khác.

Xóa các mục khỏi từ điển

Tuân theo đoạn mã sau để hiểu về cách xóa các mục khỏi từ điển -

>>> # Deleting Items from a Dictionary
>>>
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System',
'Bill Gates': 'Owner'}
>>>
>>> del my_dict['Bill Gates']
>>> my_dict
{1: 'msft', 2: 'Software', 3: 'Microsoft Technologies', 4: 'Operating System'}
>>>
>>> my_dict.clear()
>>> my_dict
{}

Từ đoạn mã trên, chúng ta có thể thấy rằng -

  • del - cho phép bạn xóa từng mục khỏi từ điển bằng phím.

  • clear - Xóa tất cả các mục khỏi từ điển.

Bộ

Set () là một tập hợp không có thứ tự không có phần tử trùng lặp. Mặc dù các mục riêng lẻ là không thể thay đổi, nhưng bản thân bộ là có thể thay đổi, tức là chúng ta có thể thêm hoặc xóa các phần tử / mục khỏi bộ. Chúng ta có thể thực hiện các phép toán như liên hiệp, giao điểm, v.v. với tập hợp.

Mặc dù bộ nói chung có thể được triển khai bằng cách sử dụng cây, bộ bằng Python có thể được triển khai bằng bảng băm. Điều này cho phép nó một phương pháp được tối ưu hóa cao để kiểm tra xem một phần tử cụ thể có được chứa trong tập hợp hay không

Tạo một tập hợp

Một tập hợp được tạo bằng cách đặt tất cả các mục (phần tử) bên trong dấu ngoặc nhọn {}, được phân tách bằng dấu phẩy hoặc bằng cách sử dụng hàm tích hợp set(). Quan sát các dòng mã sau:

>>> #set of integers
>>> my_set = {1,2,4,8}
>>> print(my_set)
{8, 1, 2, 4}
>>>
>>> #set of mixed datatypes
>>> my_set = {1.0, "Hello World!", (2, 4, 6)}
>>> print(my_set)
{1.0, (2, 4, 6), 'Hello World!'}
>>>

Phương pháp cho Bộ

Quan sát đoạn mã sau để hiểu về các phương thức dành cho tập hợp -

>>> >>> #METHODS FOR SETS
>>>
>>> #add(x) Method
>>> topics = {'Python', 'Java', 'C#'}
>>> topics.add('C++')
>>> topics
{'C#', 'C++', 'Java', 'Python'}
>>>
>>> #union(s) Method, returns a union of two set.
>>> topics
{'C#', 'C++', 'Java', 'Python'}
>>> team = {'Developer', 'Content Writer', 'Editor','Tester'}
>>> group = topics.union(team)
>>> group
{'Tester', 'C#', 'Python', 'Editor', 'Developer', 'C++', 'Java', 'Content
Writer'}
>>> # intersets(s) method, returns an intersection of two sets
>>> inters = topics.intersection(team)
>>> inters
set()
>>>
>>> # difference(s) Method, returns a set containing all the elements of
invoking set but not of the second set.
>>>
>>> safe = topics.difference(team)
>>> safe
{'Python', 'C++', 'Java', 'C#'}
>>>
>>> diff = topics.difference(group)
>>> diff
set()
>>> #clear() Method, Empties the whole set.
>>> group.clear()
>>> group
set()
>>>

Toán tử cho Bộ

Quan sát đoạn mã sau để hiểu về các toán tử cho các tập hợp -

>>> # PYTHON SET OPERATIONS
>>>
>>> #Creating two sets
>>> set1 = set()
>>> set2 = set()
>>>
>>> # Adding elements to set
>>> for i in range(1,5):
   set1.add(i)
>>> for j in range(4,9):
   set2.add(j)
>>> set1
{1, 2, 3, 4}
>>> set2
{4, 5, 6, 7, 8}
>>>
>>> #Union of set1 and set2
>>> set3 = set1 | set2 # same as set1.union(set2)
>>> print('Union of set1 & set2: set3 = ', set3)
Union of set1 & set2: set3 = {1, 2, 3, 4, 5, 6, 7, 8}
>>>
>>> #Intersection of set1 & set2
>>> set4 = set1 & set2 # same as set1.intersection(set2)
>>> print('Intersection of set1 and set2: set4 = ', set4)
Intersection of set1 and set2: set4 = {4}
>>>
>>> # Checking relation between set3 and set4
>>> if set3 > set4: # set3.issuperset(set4)
   print('Set3 is superset of set4')
elif set3 < set4: #set3.issubset(set4)
   print('Set3 is subset of set4')
else: #set3 == set4
   print('Set 3 is same as set4')
Set3 is superset of set4
>>>
>>> # Difference between set3 and set4
>>> set5 = set3 - set4
>>> print('Elements in set3 and not in set4: set5 = ', set5)
Elements in set3 and not in set4: set5 = {1, 2, 3, 5, 6, 7, 8}
>>>
>>> # Check if set4 and set5 are disjoint sets
>>> if set4.isdisjoint(set5):
   print('Set4 and set5 have nothing in common\n')
Set4 and set5 have nothing in common
>>> # Removing all the values of set5
>>> set5.clear()
>>> set5 set()