Python đã được sử dụng trên toàn thế giới cho các lĩnh vực khác nhau như làm trang web, trí tuệ nhân tạo và nhiều hơn nữa. Nhưng để có thể làm được tất cả những điều này, dữ liệu đóng một vai trò rất quan trọng, điều đó có nghĩa là dữ liệu này cần được lưu trữ hiệu quả và việc truy cập nó phải kịp thời. Vậy làm thế nào để bạn đạt được điều này? Và đó chính là Cấu trúc dữ liệu. Chúng ta hãy tìm hiểu Cấu trúc dữ liệu trong Python thông qua các chủ đề sẽ được đề cập dưới đây.

Bạn đang xem: Cấu trúc dữ liệu và giải thuật python


*
Các cấu trúc dữ liệu trong Python bạn cần học

Để tiện cho việc tìm hiểu ta sẽ đi qua các đề mục sau: 

Cấu trúc dữ liệu là gì?
Các kiểu cấu trúc dữ liệu trong Python
Cấu trúc dữ liệu tích hợp
Danh sách (List)Từ điển (Dictionary)Tuple
Sets
Cấu trúc dữ liệu do người dùng xác định
Arrays vs. List
Stack
Queue
Trees
Linked Lists
Graphs
Hash
Maps
< Ẩn >

Cấu trúc dữ liệu là gì?

Các kiểu cấu trúc dữ liệu trong Python

Cấu trúc dữ liệu tích hợp (Built-in Data Structures)

Lists

Dictionary

Tuple (các bộ dữ liệu)

Sets

User-Defined Data Structures (Cấu trúc dữ liệu do người dùng xác định)

Arrays vs. Lists

Stack

Queue

Tree

Danh sách liên kết (Linked List)

Đồ thị (Graph)

Hash
Maps

Tuyển gấp Backend Developer (C++, Python, Java) - 4 YOEHOT

Vi
Lik So
Ci
AL Med
IA

Fullstack Developer (Java
Script, Python)

Công ty Cổ phần Chứng khoán KIS Việt Nam

Fullstack Developer (HTML5, Python, Node
JS)

FPLand


Cấu trúc dữ liệu là gì?

Việc tổ chức, quản lý và lưu trữ dữ liệu rất quan trọng vì nó cho phép truy cập dễ dàng hơn và sửa đổi hiệu quả. Cấu trúc dữ liệu (Data Structure) cho phép bạn sắp xếp dữ liệu của mình theo cách cho phép bạn lưu trữ các bộ dữ liệu được thu thập, liên quan đến chúng và theo đó mà thực hiện các thao tác trên chúng.

Có thể bạn quan tâm: Top 10 tài liệu lập trình Python cơ bản và nâng cao

Các kiểu cấu trúc dữ liệu trong Python


*
Các kiểu cấu trúc dữ liệu trong Python

Python có hỗ trợ ngầm cho Cấu trúc dữ liệu cho phép bạn lưu trữ và truy cập dữ liệu. Các cấu trúc này được gọi là List, Dictionary, Tuple và Set.

Python cho phép người dùng tạo Cấu trúc dữ liệu của riêng họ, cho phép toàn quyền kiểm soát chức năng. Các cấu trúc dữ liệu nổi bật nhất là Stack, Queue, Tree, Linked List, v.v. đồng thời cũng có sẵn trong các ngôn ngữ lập trình khác. Vì vậy, bây giờ bạn đã biết các loại có sẵn bao gồm những gì, vậy còn ngại gì việc dùng Cấu trúc dữ liệu và triển khai chúng bằng Python.

Cấu trúc dữ liệu tích hợp (Built-in Data Structures)

Về cấu trúc dữ liệu trong Python, các Cấu trúc dữ liệu này được tích hợp sẵn với Python giúp lập trình dễ dàng hơn và giúp các lập trình viên sử dụng chúng để có được các giải pháp nhanh hơn. Hãy cùng tìm hiểu chi tiết hơn từng phần trong cấu trúc dữ liệu.

Lists
*
Data Structure dạng Lists

Lists được sử dụng để lưu trữ dữ liệu của các loại dữ liệu khác nhau một cách tuần tự. Có các địa chỉ được gán cho mọi thành phần của danh sách, được gọi là Index. Giá trị chỉ mục bắt đầu từ 0 và tiếp tục cho đến khi phần tử cuối cùng được gọi là chỉ số dương. Ngoài ra còn có lập chỉ mục tiêu cực bắt đầu từ -1 cho phép bạn truy cập các phần tử từ cuối đến trước. Xem qua ví dụ bên dưới để hiểu rõ hơnTạo một Lists:Để tạo danh sách, bạn sử dụng dấu ngoặc vuông và thêm các yếu tố vào đó. Nếu bạn không vượt qua bất kỳ yếu tố nào trong dấu ngoặc vuông, bạn sẽ nhận được một danh sách trống làm đầu ra.

1my_list = <> #create empty list
2print(my_list)
3my_list = <1, 2, 3, 'example', 3.132> #creating list with data
4print(my_list)

Output: <><1, 2, 3, ‘example’, 3.132>

Thêm các yếu tố:

Thêm các yếu tố trong danh sách có thể đạt được bằng cách sử dụng các hàm append (), extend () và insert ().

Hàm append () thêm tất cả các phần tử được truyền vào nó dưới dạng một phần tử.Hàm extend () thêm từng phần tử vào danh sách.Hàm insert () thêm phần tử được truyền vào giá trị chỉ mục và tăng kích thước của danh sách.
1my_list = <1, 2, 3>
2print(my_list)
3my_list.append(<555, 12>) #add as a single element
4print(my_list)
5my_list.extend(<234, 'more_example'>) #add as different elements
6print(my_list)
7my_list.insert(1, 'insert_example') #add element i
8print(my_list)

Output:<1, 2, 3><1, 2, 3, <555, 12>><1, 2, 3, <555, 12>, 234, ‘more_example’><1, ‘insert_example’, 2, 3, <555, 12>, 234, ‘more_example’>Xóa các yếu tố:

Để xóa các thành phần, hãy sử dụng từ khóa del được tích hợp sẵn trong Python nhưng điều này không trả lại bất cứ điều gì cho chúng tôi.Nếu bạn muốn phần tử quay lại, bạn sử dụng hàm pop () lấy giá trị chỉ mục.Để loại bỏ một phần tử theo giá trị của nó, bạn sử dụng hàm remove ().

Ví dụ:

1my_list = <1, 2, 3, 'example', 3.132, 10, 30>
2del my_list<5> #delete element at index 5
3print(my_list)
4my_list.remove('example') #remove element with value
5a = my_list.pop(1) #pop element from list
6a = my_list.pop(1) #pop element from list
7print('Popped Element: ', a, ' List remaining: ', my_list)
8my_list.clear() #empty the list
9print(my_list)

Output:<1, 2, 3, ‘example’, 3.132, 30><1, 2, 3, 3.132, 30>Popped Element: 2 List remaining: <1, 3, 3.132, 30><>Yếu tố truy cập:Truy cập các phần tử giống như truy cập Chuỗi (Strings) trong Python. Bạn vượt qua các giá trị index và do đó có thể có được các giá trị khi cần thiết.

1my_list = <1, 2, 3, 'example', 3.132, 10, 30>
2for element in my_list: #access elements one by one
3 print(element)
4print(my_list) #access all elements
5print(my_list<3>) #access index 3 element
6print(my_list<0:2>) #access elements from 0 to 1 and exclude 2
7print(my_list<::-1>) #access elements in reverse

Output:123example3.1321030<1, 2, 3, ‘example’, 3.132, 10, 30>example<1, 2><30, 10, 3.132, ‘example’, 3, 2, 1>Các chức năng khác:Bạn có một số chức năng khác có thể được sử dụng khi làm việc với cấu trúc dữ liệu trong Python này.

Hàm len () trả về cho chúng ta độ dài của list.Hàm index () tìm giá trị chỉ mục của giá trị được truyền vào nơi nó đã gặp lần đầu tiên.Hàm Count () tìm số đếm của giá trị được truyền cho nó.Các hàm được sắp xếp () và sort () thực hiện cùng một việc, đó là sắp xếp các giá trị của danh sách. Sắp xếp () có kiểu trả về trong khi sort () sửa đổi list ban đầu.
1my_list = <1, 2, 3, 10, 30, 10>
2print(len(my_list)) #find length of list
3print(my_list.index(10)) #find index of element that occurs first
4print(my_list.count(10)) #find count of the element
5print(sorted(my_list)) #print sorted list but not change original
6my_list.sort(reverse=True) #sort original list
7print(my_list)

Output:632<1, 2, 3, 10, 10, 30><30, 10, 10, 3, 2, 1>

Dictionary

Trong các cấu trúc dữ liệu trong Python, Dictionary được sử dụng để lưu trữ các cặp key-value. Để hiểu rõ hơn, hãy nghĩ đến một thư mục điện thoại nơi hàng trăm và hàng ngàn tên và số tương ứng của chúng đã được thêm vào. Bây giờ các giá trị không đổi ở đây là Tên và Số điện thoại được gọi là các phím. Và các tên và số điện thoại khác nhau là các giá trị đã được đưa vào các phím. Nếu bạn truy cập các giá trị của các phím, bạn sẽ nhận được tất cả tên và số điện thoại. Vì vậy, đó là những gì một cặp key-value. Và trong Python, cấu trúc này được lưu trữ bằng Dictionary. Để dễ hiểu hơn chúng ta cùng xét ví dụ.Tạo một từ điểnTừ điển có thể được tạo bằng cách sử dụng dấu ngoặc hoa hoặc sử dụng hàm dict (). Bạn cần thêm các cặp khóa-giá trị bất cứ khi nào bạn làm việc với từ điển.

1my_dict = {} #empty dictionary
2print(my_dict)
3my_dict = {1: 'Python', 2: 'Java'} #dictionary with elements
4print(my_dict)

Output:{}{1: ‘Python’, 2: ‘Java’}Thay đổi và thêm khóa, cặp giá trịĐể thay đổi các giá trị của từ điển, bạn cần phải làm điều đó bằng cách sử dụng các phím. Vì vậy, trước tiên bạn truy cập khóa và sau đó thay đổi giá trị cho phù hợp. Để thêm giá trị, bạn chỉ cần thêm một cặp key-value khác như hiển thị bên dưới:

1my_dict = {'First': 'Python', 'Second': 'Java'}
2print(my_dict)
3my_dict<'Second'> = 'C++' #changing element
4print(my_dict)
5my_dict<'Third'> = 'Ruby' #adding key-value pair
6print(my_dict)

Output:{‘First’: ‘Python’, ‘Second’: ‘Java’}{‘First’: ‘Python’, ‘Second’: ‘C++’}{‘First’: ‘Python’, ‘Second’: ‘C++’, ‘Third’: ‘Ruby’}

Xóa khóa, cặp giá trịĐể xóa các giá trị, bạn sử dụng hàm pop () trả về giá trị đã bị xóa.Để truy xuất cặp khóa-giá trị, bạn sử dụng hàm popitem () trả về một bộ khóa và giá trị.Để xóa toàn bộ Dictionary, bạn sử dụng hàm clear ().Output:Value: Ruby
Dictionary: {‘First’: ‘Python’, ‘Second’: ‘Java’}

Key, value pair: (‘Second’, ‘Java’)Dictionary {‘First’: ‘Python’}

{}Yếu tố truy cậpBạn chỉ có thể truy cập các yếu tố bằng cách sử dụng các phím. Bạn có thể sử dụng hàm get () hoặc chỉ truyền các giá trị chính và bạn sẽ truy xuất các giá trị.

1my_dict = {'First': 'Python', 'Second': 'Java'}
2print(my_dict<'First'>) #access elements using keys
3print(my_dict.get('Second'))

Output:Python
JavaCác chức năng khácTrong chức năng của cấu trúc dữ liệu trong Python này, bạn có các hàm khác nhau trả về cho chúng ta các khóa hoặc các giá trị của cặp key-value tương ứng với các hàm khóa (), giá trị (), vật phẩm () tương ứng.

1my_dict = {'First': 'Python', 'Second': 'Java', 'Third': 'Ruby'}
2print(my_dict.keys()) #get keys
3print(my_dict.values()) #get values
4print(my_dict.items()) #get key-value pairs
5print(my_dict.get('First'))

Output:dict_keys(<‘First’, ‘Second’, ‘Third’>)dict_values(<‘Python’, ‘Java’, ‘Ruby’>)dict_items(<(‘First’, ‘Python’), (‘Second’, ‘Java’), (‘Third’, ‘Ruby’)>)Python

Tuple (các bộ dữ liệu)

Dưới đây là so sánh 2 cấu trúc dữ liệu trong Python Tuple vs List 

Để biết rõ hơn các phương thức trên hoạt động ra sao, mình dùng help() để xem tài liệu về chúng.

Bạn có thấy đối số đặt biệt / bên dưới chứ, hi vọng bạn biết chúng dùng để làm gì ^^(nếu chưa rõ mời bạn ghé đọc phần Function trong bài này nhé)

Một vài cách tiếp cận tương đương:

list.append(x) tương đương với a = hoặc a.insert(len(a), x)

list.extend(iterable) tương đương a = iterable

list.clear() tương đương với del a<:>

list.copy() tương đương với a<:>

list.pop(x) sẽ xoá một giá trị có index là x ra khỏi list và trả về giá trị đó

còn del(a) sẽ đi xoá giá trị có index là x của list a, hoặc có thể xoá cả list a với del(a).

Những phương thức gọi có thể gây lỗi như list.remove(x), list.index(x) raise Value
Error
nếu x không tồn tại.

Những phương thức như insert(), remove(), sort() trả về None(vì làm thay đổi các dữ liệu gốc)

Với list, ta có thể sử dụng nó như là một ngăn xếp(stack), thêm giá trị vào ngăn xếp với append(), lấy giá trị mới nhất được thêm vào ra ngoài ngăn xếp bằng pop().

Với list, cũng có thể dùng như một hàng đợi(queue), thêm giá trị vào hàng đợi với append(), lấy bạn đợi lâu nhất ra trước với popleft().

Ngoài ra, list comprehension là cách tạo list đơn ngắn gọn, ví dụ: numbers = sẽ tương đương với

numbers = <>

for x in range(10):

number.append(x)

Tuples

Tuple cũng là một kiểu dữ kiệu chuỗi và các giá trị được bọc bên trong hai dấu ngoặc đơn ngăn cách bằng dấu phẩy, ví dụ: a = (‘hi’, ‘there’)

Tuple tương tự như list, chỉ khác là tuple là kiểu dữ liệu immutable(không thay đổi được), còn list thì mutable(có thể thay đối).

Là kiểu dữ liệu immutable nhưng tuple có thể chứa các dữ liệu mutable được, ví dụ: b = (<1,2>, <3,4>)

Tuple có khả năng packing(tự nối lại được), như sau: a = ‘hi’, ‘there‘ hay c = ‘hi’

(chú ý dấu phẩy ở cuối trong trường hợp tuple chỉ chứa một phần tử con)

Và ngược lại, nó cũng có khả năng unpacking(tự tách ra được)

*
* x, y = a** thì x sẽ có giá trị là ‘hi’ và y là ‘there’.

tuple là kiểu dữ liệu không thay đổi được nên nó chỉ có phương thức count()index()

Sets

Set là bộ sưu tập không theo thứ tự các phần tử không trùng nhau, được bọc bởi hai dấu ngoặc nhọn {} hoặc khởi tạo bằng set().

Set có hỗ trợ các phương thức của tổ hợp như là phép toán giao, phép toán hợp, phép đối xứng, phép loại trừ.

Set có hỗ trợ set comprehensions.

Lưu ý không khởi tạo set rỗng bằng {} được, phải dùng set(), vì {} thể hiện cho kiểu dữ liệu dict

Dictionary(từ điển)

Nếu như list, tuple, set là các kiểu dữ liệu có thứ tự là các chữ số thì dict là kiểu dữ liệu có thứ tự là các từ khoá, và từ khoá là kiểu dữ liệu immutable như strings, numbers, tuples(không chứa giá trị mutable).

Có thể hiểu đơn giản dictionary là một bộ sưu tập của các giá trị key: value, với điều kiện key là không trùng nhau.

Xem thêm: Bộ máy tạo kiểu tóc dyson airwrap complete, dyson airwrap complete

Dict khai báo với dict() hoặc {}, ví dụ: dict(name=’Thanh’) hay {‘name’: ‘Thanh’}

Kỹ thuật lặp qua các loại dữ liệu có trình tự

Ta thường làm việc với các loại dữ liệu có trình tự bằng cách duyệt qua tất cả các phần tử của nó với for và kết hợp:

→ dùng .items() để lặp qua key, value của một dictionary

→ dùng enumerate(<‘a’, ‘b’, ‘c’>) để lặp qua chỉ số index và giá trị của chỉ số đó trong một list

→ dùng zip() có thể lặp qua nhiều loại dữ liệu trình tự, ví dụ: zip(<1, 2, 3>, <‘a’, ‘b’, ‘c’>)

→ dùng reversed() có thể lặp theo thứ tự ngược lại

→ dùng sorted() có thể tạo list mới theo thứ tự mà không làm thay đổi mảng ban đầu.

Các dạng so sánh

Trong các câu lệnh điều kiện, thường đi cùng với các dạng so sánh: