Chuyển đến nội dung chính

Hướng dẫn Cấu trúc Dữ liệu Python

Làm quen với cấu trúc dữ liệu Python: tìm hiểu thêm về kiểu dữ liệu và các cấu trúc dữ liệu nguyên thủy cũng như phi nguyên thủy, như chuỗi, danh sách, ngăn xếp, v.v.
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Cấu trúc dữ liệu là cách tổ chức và lưu trữ dữ liệu để có thể truy cập và làm việc với chúng hiệu quả. Chúng định nghĩa mối quan hệ giữa các dữ liệu và các thao tác có thể thực hiện trên dữ liệu. Có rất nhiều loại cấu trúc dữ liệu được định nghĩa để giúp các nhà khoa học dữ liệu và kỹ sư máy tính tập trung vào bức tranh lớn nhằm giải quyết các vấn đề lớn hơn thay vì sa đà vào chi tiết mô tả và truy cập dữ liệu.

Trong hướng dẫn này, bạn sẽ tìm hiểu về các cấu trúc dữ liệu Python khác nhau và xem cách chúng được triển khai:

  • Kiểu Dữ liệu Trừu tượng và Cấu trúc Dữ liệu
  • Cấu trúc Dữ liệu Nguyên thủy
    • Số nguyên (Integer)
    • Số thực (Float)
    • Chuỗi (String)
    • Boolean
  • Cấu trúc Dữ liệu Phi nguyên thủy
    • Mảng (Array)
    • Danh sách (List)
    • Bộ (Tuple)
    • Từ điển (Dictionary)
    • Tập hợp (Set)
    • Tệp (File)

diagram

Trong khóa học miễn phí Intro to Python for Data Science, bạn có thể học thêm về việc sử dụng Python trong ngữ cảnh khoa học dữ liệu. Khóa học giới thiệu các khái niệm cơ bản của Python. Với nó, bạn sẽ khám phá method, function và gói NumPy.

Kiểu Dữ liệu Trừu tượng và Cấu trúc Dữ liệu

Như bạn đã đọc trong phần mở đầu, cấu trúc dữ liệu giúp bạn tập trung vào bức tranh lớn thay vì lạc lối trong chi tiết. Điều này được gọi là trừu tượng hóa dữ liệu.

Giờ đây, cấu trúc dữ liệu thực chất là một triển khai của Kiểu Dữ liệu Trừu tượng (ADT). Triển khai này yêu cầu một góc nhìn vật lý về dữ liệu, sử dụng một tập hợp các cấu trúc lập trình và kiểu dữ liệu cơ bản.

Nhìn chung, trong khoa học máy tính, cấu trúc dữ liệu có thể được chia thành hai nhóm: nguyên thủy và phi nguyên thủy. Nhóm đầu là dạng đơn giản nhất để biểu diễn dữ liệu, trong khi nhóm sau tiên tiến hơn: chúng chứa các cấu trúc dữ liệu nguyên thủy trong những cấu trúc phức tạp hơn cho các mục đích đặc biệt.

Cấu trúc Dữ liệu Nguyên thủy

Đây là những cấu trúc dữ liệu cơ bản nhất. Chúng là nền tảng cho thao tác dữ liệu và chứa các giá trị thuần, đơn giản. Python có bốn kiểu biến nguyên thủy:

  • Số nguyên (Integer)
  • Số thực (Float)
  • Chuỗi (String)
  • Boolean

Trong các phần tiếp theo, bạn sẽ tìm hiểu thêm về chúng!

Integers

Bạn có thể dùng số nguyên để biểu diễn dữ liệu số, cụ thể là các số nguyên từ âm vô cùng đến dương vô cùng, như 4, 5 hoặc -1.

Float

"Float" là viết tắt của 'floating point number' (số dấu phẩy động). Bạn có thể dùng cho số hữu tỉ, thường có phần thập phân, như 1.11 hoặc 3.14.

Xem DataCamp Light Chunk sau và thử một số phép toán với integer và float!

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRmxvYXRzXG54ID0gNC4wXG55ID0gMi4wXG5cbiMgQWRkaXRpb25cbnByaW50KHggKyB5KVxuXG4jIFN1YnRyYWN0aW9uXG5wcmludCh4IC0geSlcblxuIyBNdWx0aXBsaWNhdGlvblxucHJpbnQoeCAqIHkpXG5cbiMgUmV0dXJucyB0aGUgcXVvdGllbnRcbnByaW50KHggLyB5KVxuXG4jIFJldHVybnMgdGhlIHJlbWFpbmRlclxucHJpbnQoeCAlIHkpIFxuXG4jIEFic29sdXRlIHZhbHVlXG5wcmludChhYnMoeCkpXG5cbiMgeCB0byB0aGUgcG93ZXIgeVxucHJpbnQoeCAqKiB5KSJ9

Lưu ý rằng trong Python, bạn không cần phải chỉ định rõ kiểu của biến hay dữ liệu. Đó là vì Python là ngôn ngữ kiểu động. Ngôn ngữ kiểu động là ngôn ngữ mà kiểu dữ liệu mà một đối tượng có thể lưu trữ là có thể thay đổi.

String

Chuỗi là tập hợp các chữ cái, từ hoặc ký tự khác. Trong Python, bạn có thể tạo chuỗi bằng cách đặt một dãy ký tự trong cặp dấu nháy đơn hoặc nháy kép. Ví dụ: 'cake', "cookie", v.v.

Bạn cũng có thể áp dụng phép toán + trên hai hoặc nhiều chuỗi để nối chúng lại, như ví dụ dưới đây:

x = 'Cake'
y = 'Cookie'
x + ' & ' + y
'Cake & Cookie'

Dưới đây là một số thao tác cơ bản khác bạn có thể làm với chuỗi; Ví dụ, bạn có thể dùng * để lặp lại một chuỗi một số lần nhất định:

# Repeat
x * 2
'CakeCake'

Bạn cũng có thể cắt chuỗi (slice), nghĩa là chọn một phần của chuỗi:

# Range Slicing
z1 = x[2:]  
print(z1)
# Slicing
z2 = y[0] + y[1]
ke
Co

Lưu ý rằng chuỗi cũng có thể là ký tự chữ-số (alpha-numeric), nhưng phép + vẫn dùng để nối chuỗi.

x = '4'
y = '2'
x + y
'42'

Python có nhiều phương thức dựng sẵn hoặc hàm trợ giúp để thao tác chuỗi. Thay thế một chuỗi con, viết hoa một số từ trong đoạn văn, tìm vị trí một chuỗi trong chuỗi khác là một vài thao tác phổ biến. Hãy xem một số thao tác sau:

Viết hoa chuỗi

str.capitalize('cookie')

'Cookie'

Lấy độ dài một chuỗi theo số ký tự. Lưu ý khoảng trắng cũng được tính vào kết quả cuối cùng:

str1 = "Cake 4 U"
str2 = "404"
len(str1)
8

Kiểm tra một chuỗi có chỉ gồm chữ số hay không

str1.isdigit()
False
str2.isdigit()
True

Thay thế một phần chuỗi bằng chuỗi khác

str1.replace('4 U', str2)
'Cake 404'

Tìm chuỗi con trong chuỗi khác; Trả về chỉ số hoặc vị trí nhỏ nhất trong chuỗi nơi tìm thấy chuỗi con:

str1 = 'cookie'
str2 = 'cook'
str1.find(str2)
0
      Chuỗi con

'cook'

      được tìm thấy ở đầu của

'cookie'

      . Do đó, bạn tham chiếu vị trí trong

'cookie'

      nơi bạn tìm thấy chuỗi con đó. Trong trường hợp này,

0

    được trả về vì bạn bắt đầu đếm từ 0!
str1 = 'I got you a cookie'
str2 = 'cook'
str1.find(str2)
12
      Tương tự, chuỗi con

'cook'

      được tìm thấy ở vị trí 12 trong

'I got you a cookie'

    . Hãy nhớ bạn bắt đầu đếm từ 0 và dấu cách cũng tính vào vị trí!

Bạn có thể tìm danh sách đầy đủ các phương thức chuỗi trong Python tại đây.

Boolean

Kiểu dữ liệu dựng sẵn này có thể nhận hai giá trị: True và False, thường có thể thay thế cho số nguyên 1 và 0. Boolean hữu ích trong các biểu thức điều kiện và so sánh, như trong ví dụ sau:

x = 4
y = 2
x == y
False
x > y
True
x = 4
y = 2
z = (x==y) # Biểu thức so sánh (Đánh giá là false)
if z: # Rẽ nhánh theo giá trị đúng/sai của 'z'
    print("Cookie")
else: print("No Cookie")
No Cookie

Chuyển đổi Kiểu Dữ liệu

Đôi khi, bạn sẽ làm việc trên code của người khác và cần chuyển một số nguyên thành số thực hoặc ngược lại, chẳng hạn. Hoặc có thể bạn phát hiện ra mình đã dùng số nguyên trong khi thực tế cần số thực. Trong các trường hợp như vậy, bạn có thể chuyển đổi kiểu dữ liệu của biến!

Để kiểm tra kiểu của một đối tượng trong Python, dùng hàm dựng sẵn type(), như trong các dòng code dưới đây:

i = 4.0
type(i)
float

Khi bạn thay đổi kiểu của một thực thể từ kiểu dữ liệu này sang kiểu khác, điều đó được gọi là "ép kiểu" (typecasting). Có hai kiểu chuyển đổi dữ liệu có thể xảy ra: ngầm định còn gọi là coercion và tường minh, thường gọi là casting.

Chuyển đổi kiểu dữ liệu ngầm định

Đây là chuyển đổi dữ liệu tự động và trình biên dịch sẽ xử lý cho bạn. Hãy xem các ví dụ sau:

# A float
x = 4.0 

# An integer
y = 2 

# Divide `x` by `y`
z = x/y

# Check the type of `z`
type(z)
float

Trong ví dụ trên, bạn không cần phải đổi kiểu dữ liệu của y một cách tường minh để thực hiện phép chia cho ra giá trị float. Trình biên dịch đã làm điều đó ngầm định cho bạn.

Thật dễ!

Chuyển đổi kiểu dữ liệu tường minh

Loại chuyển đổi này do người dùng quyết định, nghĩa là bạn phải chỉ rõ cho trình biên dịch đổi kiểu dữ liệu của một số thực thể. Xem khối code dưới đây để hiểu đầy đủ:

x = 2
y = "The Godfather: Part "
fav_movie = y + x
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-51-b8fe90df9e0e> in <module>()
      1 x = 2
      2 y = "The Godfather: Part "
----> 3 fav_movie = y + x


TypeError: Can't convert 'int' object to str implicitly

Ví dụ trên báo lỗi vì trình biên dịch không hiểu bạn đang cố nối hay cộng vì kiểu dữ liệu lẫn lộn. Bạn có một số nguyên và một chuỗi đang cố cộng với nhau.

Có sự không khớp rõ ràng.

Để giải quyết, trước hết bạn cần chuyển int sang string rồi mới có thể nối chuỗi.

Lưu ý rằng không phải lúc nào cũng có thể chuyển một kiểu dữ liệu sang kiểu khác. Một số hàm chuyển đổi dựng sẵn bạn có thể dùng là: int(), float() và str().

x = 2
y = "The Godfather: Part "
fav_movie = (y) + str(x)
print(fav_movie)
The Godfather: Part 2

Cấu trúc Dữ liệu Phi nguyên thủy

Các kiểu phi nguyên thủy là những thành viên tinh vi hơn trong họ cấu trúc dữ liệu. Chúng không chỉ lưu một giá trị, mà là một tập hợp giá trị ở nhiều định dạng.

Trong thế giới khoa học máy tính truyền thống, các cấu trúc dữ liệu phi nguyên thủy được chia thành:

  • Mảng (Array)
  • Danh sách (List)
  • Tệp (File)

Array

Trước hết, mảng trong Python là cách gọn nhẹ để gom các kiểu dữ liệu cơ bản; mọi phần tử trong một mảng phải cùng kiểu dữ liệu. Tuy nhiên, mảng không quá phổ biến trong Python, không như các ngôn ngữ khác như C++ hay Java.

Nhìn chung, khi người ta nói về mảng trong Python, họ thực ra đang nói về list. Tuy nhiên, có một khác biệt cơ bản giữa chúng, bạn sẽ thấy ngay. Với Python, mảng có thể được xem như một cách hiệu quả hơn để lưu một dạng danh sách nhất định. Dạng danh sách này có các phần tử cùng kiểu dữ liệu.

Trong Python, mảng được hỗ trợ bởi mô-đun array và cần import trước khi khởi tạo và sử dụng. Các phần tử lưu trong mảng bị ràng buộc về kiểu dữ liệu. Kiểu dữ liệu được chỉ định khi tạo mảng bằng type code, là một ký tự đơn như I bạn thấy trong ví dụ dưới đây:

import array as arr
a = arr.array("I",[3,6,9])
type(a)
array.array

Trang tài liệu Python Array cung cấp thêm thông tin về các type code sẵn có và các chức năng mà mô-đun array hỗ trợ.

List

List trong Python dùng để lưu tập hợp các phần tử không đồng nhất. Chúng là mutable, nghĩa là bạn có thể thay đổi nội dung mà không đổi danh tính của list. Bạn nhận ra list nhờ cặp ngoặc vuông [ và ] chứa các phần tử ngăn cách bởi dấu phẩy ,. List là thành phần dựng sẵn của Python: bạn không cần gọi riêng.

x = [] # Empty list
type(x)
list
x1 = [1,2,3]
type(x1)
list
x2 = list([1,'apple',3])
type(x2)
list
print(x2[1])
apple
x2[1] = 'orange'
print(x2)
[1, 'orange', 3]

Lưu ý: như bạn thấy trong ví dụ trên với x1, list cũng có thể chứa các phần tử đồng nhất và do đó đáp ứng chức năng lưu trữ của một mảng. Điều này ổn trừ khi bạn muốn áp dụng một số thao tác đặc thù cho tập hợp này.

Python cung cấp nhiều phương thức để thao tác và làm việc với list. Thêm phần tử mới, loại bỏ một số phần tử, sắp xếp hoặc đảo ngược list là các thao tác thường gặp. Hãy xem một vài thao tác thực tế:

  • Thêm 11 vào list list_num bằng append(). Mặc định, số này sẽ được thêm vào cuối list.
list_num = [1,2,45,6,7,2,90,23,435]
list_char = ['c','o','o','k','i','e']

list_num.append(11) # Add 11 to the list, by default adds to the last position
print(list_num)
[1, 2, 45, 6, 7, 2, 90, 23, 435, 11]
  • Dùng insert() để chèn 11 tại chỉ số hoặc vị trí 0 trong list list_num
list_num.insert(0, 11)
print(list_num)
[11, 1, 2, 45, 6, 7, 2, 90, 23, 435, 11]
  • Xóa lần xuất hiện đầu tiên của 'o' khỏi list_char với remove()
list_char.remove('o') 
print(list_char)
['c', 'o', 'k', 'i', 'e']
  • Xóa phần tử tại chỉ số -2 khỏi list_char
list_char.pop(-2) # Removes the item at the specified position
print(list_char)
['c', 'o', 'k', 'e']
list_num.sort() # In-place sorting
print(list_num)
[1, 2, 2, 6, 7, 11, 11, 23, 45, 90, 435]
list.reverse(list_num)
print(list_num)
[435, 90, 45, 23, 11, 11, 7, 6, 2, 2, 1]

Nếu bạn muốn tìm hiểu thêm về list trong Python, bạn có thể xem hướng dẫn 18 Câu hỏi về List trong Python thường gặp nhất!

Array so với List

Giờ bạn đã thấy list trong Python, bạn có thể tự hỏi vì sao còn cần mảng. Lý do là chúng khác biệt căn bản về các thao tác có thể thực hiện. Với mảng, bạn có thể dễ dàng thao tác trên từng phần tử của nó, điều này có thể không đúng với list. Đây là một minh họa:

array_char = array.array("u",["c","a","t","s"])
array_char.tostring()
print(array_char)
array('u', 'cats')

Bạn có thể áp dụng hàm tostring() của array_char vì Python biết rằng tất cả các phần tử trong mảng có cùng kiểu dữ liệu và do đó thao tác ứng xử như nhau trên từng phần tử. Vì vậy, mảng có thể rất hữu ích khi xử lý một tập hợp lớn kiểu dữ liệu đồng nhất. Do Python không phải ghi nhớ chi tiết kiểu dữ liệu của từng phần tử riêng lẻ; với một số trường hợp, mảng có thể nhanh hơn và dùng ít bộ nhớ hơn so với list.

Cũng đáng nhắc đến mảng NumPy khi bàn về mảng. Mảng NumPy được dùng rất nhiều trong khoa học dữ liệu để làm việc với mảng đa chiều. Chúng hiệu quả hơn mô-đun array và list của Python nói chung. Việc đọc và ghi phần tử trong mảng NumPy nhanh hơn, và chúng hỗ trợ các phép toán “vector hóa” như cộng theo phần tử. Ngoài ra, mảng NumPy hoạt động hiệu quả với các tập dữ liệu thưa, lớn. Để tìm hiểu thêm, hãy xem Hướng dẫn Python Numpy Array của DataCamp.

Dưới đây là một số đoạn code để bạn bắt đầu với NumPy Array:

import numpy as np

arr_a = np.array([3, 6, 9])
arr_b = arr_a/3 # Performing vectorized (element-wise) operations 
print(arr_b)
[ 1.  2.  3.]
arr_ones = np.ones(4)
print(arr_ones)
[ 1.  1.  1.  1.]
multi_arr_ones = np.ones((3,4)) # Creating 2D array with 3 rows and 4 columns
print(multi_arr_ones)
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]

Truyền thống, cấu trúc dữ liệu list còn có thể được phân loại thành tuyến tính và phi tuyến tính. Stacks và Queues được gọi là "cấu trúc dữ liệu tuyến tính", trong khi Graphs và Trees là "cấu trúc dữ liệu phi tuyến tính". Những cấu trúc và khái niệm này có thể khá phức tạp nhưng được dùng rộng rãi vì chúng giống với các mô hình thế giới thực. Bạn sẽ lướt qua các chủ đề này trong hướng dẫn này.

Lưu ý: trong cấu trúc dữ liệu tuyến tính, các phần tử dữ liệu được tổ chức tuần tự, hay nói cách khác là theo hàng. Các phần tử được duyệt nối tiếp từng cái một và toàn bộ phần tử trong một cấu trúc dữ liệu tuyến tính có thể được duyệt trong một lượt chạy. Tuy nhiên, trong cấu trúc dữ liệu phi tuyến tính, các phần tử dữ liệu không được tổ chức tuần tự. Điều đó có nghĩa là các phần tử có thể kết nối với nhiều phần tử khác để phản ánh mối quan hệ đặc biệt giữa chúng. Tất cả phần tử trong một cấu trúc dữ liệu phi tuyến tính có thể không được duyệt hết trong một lượt chạy.

Stacks

Một stack là một vùng chứa các đối tượng được chèn vào và loại bỏ theo nguyên tắc Vào Sau Ra Trước (LIFO). Hãy nghĩ đến tình huống trong một bữa tiệc tối nơi có một chồng đĩa, đĩa luôn được thêm vào hoặc lấy ra từ đỉnh chồng. Trong khoa học máy tính, khái niệm này được dùng để đánh giá biểu thức và phân tích cú pháp, lập lịch thuật toán/thủ tục, v.v.

Stack có thể được triển khai bằng list trong Python. Khi bạn thêm phần tử vào stack, đó gọi là thao tác push, còn khi bạn loại bỏ hay xóa một phần tử gọi là thao tác pop. Lưu ý rằng bạn thực sự có phương thức pop() sẵn dùng khi làm việc với stack trong Python:

# Bottom -> 1 -> 2 -> 3 -> 4 -> 5 (Top)
stack = [1,2,3,4,5] 
stack.append(6) # Bottom -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 (Top)
print(stack)
[1, 2, 3, 4, 5, 6]
stack.pop() # Bottom -> 1 -> 2 -> 3 -> 4 -> 5 (Top)
stack.pop() # Bottom -> 1 -> 2 -> 3 -> 4 (Top)
print(stack)
[1, 2, 3, 4]

Queue

Một queue là một vùng chứa các đối tượng được chèn và loại bỏ theo nguyên tắc Vào Trước Ra Trước (FIFO). Ví dụ thực tế tuyệt vời của queue là hàng người ở quầy vé: mọi người được phục vụ theo thứ tự đến, và vì vậy người đến trước cũng là người rời đi trước. Queue có thể có nhiều loại khác nhau.

List không hiệu quả để triển khai queue, vì append() và pop() ở cuối list không nhanh và kéo theo chi phí di chuyển bộ nhớ. Bên cạnh đó, chèn ở cuối và xóa từ đầu list cũng không nhanh vì cần dịch chuyển vị trí phần tử.

Graphs

Một đồ thị trong toán học và khoa học máy tính là các mạng gồm các nút, còn gọi là đỉnh, có thể kết nối hoặc không với nhau. Đường nối hai nút gọi là cạnh. Nếu cạnh có hướng, đó là đồ thị có hướng, và cạnh có hướng gọi là cung. Nếu không có hướng, đồ thị gọi là vô hướng.

Nghe có vẻ rất lý thuyết và có thể trở nên khá phức tạp khi đào sâu. Tuy nhiên, đồ thị là khái niệm quan trọng, đặc biệt trong khoa học dữ liệu, và thường dùng để mô hình hóa các vấn đề thực tế. Mạng xã hội, nghiên cứu phân tử trong hóa học và sinh học, bản đồ, và hệ thống gợi ý đều dựa vào đồ thị và lý thuyết đồ thị.

Dưới đây, bạn sẽ thấy một triển khai đồ thị đơn giản sử dụng Python Dictionary để bắt đầu:

graph = { "a" : ["c", "d"],
          "b" : ["d", "e"],
          "c" : ["a", "e"],
          "d" : ["a", "b"],
          "e" : ["b", "c"]
        }

def define_edges(graph):
    edges = []
    for vertices in graph:
        for neighbour in graph[vertices]:
            edges.append((vertices, neighbour))
    return edges

print(define_edges(graph))
[('a', 'c'), ('a', 'd'), ('b', 'd'), ('b', 'e'), ('c', 'a'), ('c', 'e'), ('e', 'b'), ('e', 'c'), ('d', 'a'), ('d', 'b')]

Bạn có thể làm nhiều việc thú vị với đồ thị, như thử tìm xem có tồn tại đường đi giữa hai nút hay không, hoặc tìm đường đi ngắn nhất giữa hai nút, xác định chu trình trong đồ thị.

Bài toán nổi tiếng "người bán hàng rong" thực chất là tìm lộ trình ngắn nhất có thể đi qua mọi nút đúng một lần và trở về điểm xuất phát. Đôi khi các nút hoặc cung của đồ thị được gán trọng số hoặc chi phí; bạn có thể hình dung như gán mức độ khó để đi, và bạn quan tâm đến việc tìm đường rẻ nhất hoặc dễ nhất.

Trees

Một cái cây trong đời thực là một sinh vật với rễ bám đất và các cành mang lá, quả vươn ra ngoài. Các cành cây tỏa ra theo cách có phần có tổ chức. Trong khoa học máy tính, cây được dùng để mô tả cách dữ liệu đôi khi được tổ chức, ngoại trừ việc "rễ" ở phía trên và các cành, lá phía dưới, cây được vẽ lộn ngược so với cây thật.

Giới thiệu thêm một chút ký hiệu, gốc (root) luôn ở trên cùng của cây. Giữ phép ẩn dụ, các nút tiếp theo gọi là cành, và nút cuối cùng trên mỗi cành gọi là lá. Bạn có thể tưởng tượng mỗi cành là một cây nhỏ hơn. Gốc thường gọi là cha (parent) và các nút bên dưới mà nó tham chiếu gọi là con (children). Các nút cùng chung một cha gọi là anh chị em (siblings). Bạn thấy vì sao nó cũng được gọi là cây gia phả chứ?

Cây giúp mô tả các kịch bản đời thực và được dùng ở khắp nơi từ thế giới trò chơi đến thiết kế bộ phân tích XML, và cả nguyên lý thiết kế PDF cũng dựa trên cây. Trong khoa học dữ liệu, 'Học dựa trên Cây quyết định' thực sự là một lĩnh vực nghiên cứu lớn. Nhiều phương pháp nổi tiếng như bagging, boosting dùng mô hình cây để tạo mô hình dự đoán. Các trò như cờ vua xây dựng một cây khổng lồ với mọi nước đi có thể để phân tích và áp dụng heuristic nhằm quyết định nước đi tối ưu.

Bạn có thể triển khai cấu trúc cây bằng cách sử dụng và kết hợp các cấu trúc dữ liệu đã thấy trong hướng dẫn này. Tuy nhiên, để đơn giản, chủ đề này sẽ được bàn trong một bài khác.

diagram

class Tree:
    def __init__(self, info, left=None, right=None):
        self.info = info
        self.left  = left
        self.right = right

    def __str__(self):
        return (str(self.info) + ', Left child: ' + str(self.left) + ', Right child: ' + str(self.right))

tree = Tree(1, Tree(2, 2.1, 2.2), Tree(3, 3.1))
print(tree)
1, Left child: 2, Left child: 2.1, Right child: 2.2, Right child: 3, Left child: 3.1, Right child: None

Bạn đã học về mảng và cũng đã thấy cấu trúc dữ liệu list. Tuy nhiên, Python cung cấp nhiều cơ chế thu thập dữ liệu khác nhau, và dù chúng có thể không nằm trong các chủ đề cấu trúc dữ liệu truyền thống trong khoa học máy tính, chúng vẫn đáng biết, đặc biệt liên quan tới ngôn ngữ Python:

  • Tuple
  • Dictionary
  • Set

Tuples

Tuple là một kiểu dữ liệu chuỗi tiêu chuẩn khác. Điểm khác biệt giữa tuple và list là tuple là immutable, nghĩa là một khi đã định nghĩa, bạn không thể xóa, thêm hay chỉnh sửa bất kỳ giá trị nào bên trong. Điều này hữu ích trong các tình huống bạn muốn trao quyền kiểm soát cho người khác nhưng không muốn họ thao túng dữ liệu trong tập hợp của bạn, mà có lẽ chỉ xem hoặc thao tác riêng trên một bản sao.

Hãy xem tuple được triển khai như thế nào:

x_tuple = 1,2,3,4,5
y_tuple = ('c','a','k','e')
x_tuple[0]
1
y_tuple[3]
x_tuple[0] = 0 # Cannot change values inside a tuple
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-74-b5d6da8c1297> in <module>()
      1 y_tuple[3]
----> 2 x_tuple[0] = 0 # Cannot change values inside a tuple


TypeError: 'tuple' object does not support item assignment

Dictionary

Dictionary là thứ bạn cần nếu muốn triển khai cái gì đó tương tự sổ điện thoại. Không một cấu trúc dữ liệu nào bạn đã thấy trước đó phù hợp cho sổ điện thoại.

Đây là lúc dictionary trở nên hữu ích. Dictionary được tạo từ các cặp khóa-giá trị. key dùng để nhận diện mục và value như tên gọi, giữ giá trị của mục đó.

x_dict = {'Edward':1, 'Jorge':2, 'Prem':3, 'Joe':4}
del x_dict['Joe']
x_dict
{'Edward': 1, 'Jorge': 2, 'Prem': 3}
x_dict['Edward'] # Prints the value stored with the key 'Edward'.
1

Bạn có thể áp dụng nhiều chức năng dựng sẵn khác trên dictionary:

len(x_dict)
3
x_dict.keys()
dict_keys(['Prem', 'Edward', 'Jorge'])
x_dict.values()

dict_values([3, 1, 2])

Đoạn mã này minh họa việc dùng Python dictionary để lưu và truy cập các cặp khóa-giá trị.

Đầu tiên, code gọi hàm len() với đối số là x_dict. Hàm này trả về số cặp khóa-giá trị trong dictionary, ở đây là 3.

Tiếp theo, code gọi phương thức keys() trên x_dict. Phương thức này trả về một đối tượng view chứa các khóa trong dictionary. Trong trường hợp này, các khóa là 'Prem', 'Edward' và 'Jorge', như ở output.

Sau đó, code gọi phương thức values() trên x_dict. Phương thức này trả về một đối tượng view chứa các giá trị trong dictionary. Ở đây, các giá trị lần lượt là 3, 1 và 2, như ở output.

Sets

Set là tập hợp các đối tượng phân biệt (duy nhất). Chúng hữu ích để tạo các danh sách chỉ giữ các giá trị duy nhất trong tập dữ liệu. Đây là một tập hợp không có thứ tự nhưng có thể thay đổi (mutable), rất hữu ích khi duyệt qua tập dữ liệu lớn.

x_set = set('CAKE&COKE')
y_set = set('COOKIE')

print(x_set)
{'A', '&', 'O', 'E', 'C', 'K'}
print(y_set) # Single unique 'o'
{'I', 'O', 'E', 'C', 'K'}
print(x - y) # All the elements in x_set but not in y_set
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-3-31abf5d98454> in <module>()
----> 1 print(x - y) # All the elements in x_set but not in y_set


NameError: name 'x' is not defined
print(x_set|y_set) # Unique elements in x_set or y_set or both
{'C', '&', 'E', 'A', 'O', 'K', 'I'}
print(x_set & y_set) # Elements in both x_set and y_set

{'O', 'E', 'K', 'C'}

Đoạn code tạo hai set: x_set và y_set. Mỗi set được tạo bằng cách truyền một chuỗi ký tự làm đối số cho hàm set(). Ở đây, x_set được tạo từ chuỗi 'CAKE&COKE', còn y_set từ chuỗi 'COOKIE'.

Tiếp theo, code in từng set bằng hàm print(). Lệnh print() đầu in x_set, chứa các ký tự duy nhất trong chuỗi 'CAKE&COKE'. Kết quả cho thấy x_set gồm các ký tự 'A', '&', 'O', 'E', 'C' và 'K'. Tương tự, lệnh print() thứ hai in y_set, chứa các ký tự duy nhất trong chuỗi 'COOKIE'. Kết quả cho thấy y_set gồm 'I', 'O', 'E', 'C' và 'K'.

Lệnh print() thứ ba cố in tập hợp tất cả phần tử có trong x_set nhưng không có trong y_set. Tuy nhiên, dòng code này gây NameError vì biến x chưa được định nghĩa. Nhiều khả năng dòng này nên là print(x_set - y_set).

Lệnh print() thứ tư in tập hợp các phần tử duy nhất nằm trong x_set hoặc y_set, hoặc cả hai. Kết quả cho thấy set thu được chứa tất cả ký tự duy nhất từ cả x_set và y_set.

Cuối cùng, lệnh print() thứ năm in tập hợp các phần tử xuất hiện trong cả x_set và y_set. Kết quả cho thấy set này gồm các ký tự 'O', 'E', 'K' và 'C'.

Files

Tệp truyền thống là một phần của cấu trúc dữ liệu. Và mặc dù dữ liệu lớn là chuyện thường nhật trong ngành khoa học dữ liệu, một ngôn ngữ lập trình không có khả năng lưu trữ và truy xuất thông tin đã lưu trước đó sẽ khó hữu ích. Bạn vẫn phải sử dụng tất cả dữ liệu nằm trong các tệp trên khắp cơ sở dữ liệu và bạn sẽ học cách làm điều này.

Cú pháp đọc và ghi tệp trong Python tương tự các ngôn ngữ lập trình khác nhưng dễ xử lý hơn nhiều. Dưới đây là một số hàm cơ bản sẽ giúp bạn làm việc với tệp bằng Python:

  • open() để mở tệp trong hệ thống của bạn, filename là tên tệp cần mở;

  • read() để đọc toàn bộ tệp;

  • readline() để đọc từng dòng một;

  • write() để ghi một chuỗi vào tệp và trả về số ký tự đã ghi; Và

  • close() để đóng tệp.

# File modes (2nd argument): 'r'(read), 'w'(write), 'a'(appending), 'r+'(both reading and writing)
f = open('file_name', 'w')

# Reads entire file
f.read() 

# Reads one line at a time
f.readline() 

# Writes the string to the file, returning the number of char written
f.write('Add this line.') 

f.close()

Đối số thứ hai trong hàm open() là chế độ tệp. Nó cho phép bạn chỉ định rằng bạn muốn đọc (r), ghi (w), nối thêm (a) hoặc vừa đọc vừa ghi (r+).

Để học thêm về xử lý tệp trong Python, hãy xem trang này.

Kết luận

Chúc mừng bạn đã đến cuối hướng dẫn! Điều này giúp bạn tiến gần thêm một chủ đề tới ước mơ chinh phục thế giới khoa học dữ liệu.

Nếu bạn quan tâm, khóa học hai phần Python Data Science Toolbox của chúng tôi đi sâu hơn vào hàm, iterator, list, v.v.

Chủ đề
Python

Khoá học Python

Khóa học

Giới thiệu về Functions trong Python

3 giờ
472.3K
Học cách viết các hàm của riêng bạn trong Python, cũng như các khái niệm quan trọng như phạm vi và xử lý lỗi.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm