Hướng dẫn python complex data structures - python cấu trúc dữ liệu phức tạp

1. Một số lưu ý khi nói về kiểu dữ liệu

Trong khoa học máy tính, người ta thường dùng cụm từ kiểu dữ liệu khi nói đến việc một nhóm đối tượng có chung một (hoặc nhiều) tính chất nào đó. Ví dụ, ta hay nói biến A và biến B có cùng kiểu dữ liệu. Điều này có nghĩa là những giá trị và biến A và biến B đang dại diện có cùng cách thức lưu trữ trong bộ nhớ, có cùng một số hàm dựng sẵn để thao tác. Ví dụ: kiểu ký tự, kiểu số, v.v…kiểu dữ liệu khi nói đến việc một nhóm đối tượng có chung một (hoặc nhiều) tính chất nào đó. Ví dụ, ta hay nói biến A và biến B có cùng kiểu dữ liệu. Điều này có nghĩa là những giá trị và biến A và biến B đang dại diện có cùng cách thức lưu trữ trong bộ nhớ, có cùng một số hàm dựng sẵn để thao tác. Ví dụ: kiểu ký tự, kiểu số, v.v…

Cụ thể hơn một chút, người ta phân biệt dữ liệu kiểu số (numeric types) thành: Số nguyên (integer), số thực động (floating-point number), số phức (complex),… Ở cấp độ thấp hơn, ta còn có: int8, int16,

>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
0,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
1,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
2,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
3,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
4,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
5,
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
6, v.v… Điều quan trọng (và buồn cười) là tất cả đều có thể gọi là… kiểu.kiểu.

Trong khi đó, một cấu trúc dữ liệu là cụm từ dùng để chỉ cách tổ chức một nhóm dữ liệu sao cho các thao tác và thuật toán được thực thi hiệu quả nhất. Ví dụ cấu trúc cây (tree) được phát minh để việc tìm kiếm trở nên dễ dàng hơn.cấu trúc dữ liệu là cụm từ dùng để chỉ cách tổ chức một nhóm dữ liệu sao cho các thao tácthuật toán được thực thi hiệu quả nhất. Ví dụ cấu trúc cây (tree) được phát minh để việc tìm kiếm trở nên dễ dàng hơn.

Hướng dẫn python complex data structures - python cấu trúc dữ liệu phức tạp

Tuy nhiên, trong thực hành, thông thường ta vẫn hay dùng cụm từ “cùng kiểu” để chỉ chung cho các biến có cùng tính chất, mà không cần phân biệt chúng có cấu trúc gì và phần tử của chúng thuộc kiểu cụ thể nào. Ví dụ khi hai biến cùng là mảng numpy (

>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']
7) thì có thể nói chúng có cùng kiểu.

Lưu ý là đối với Python, mọi thứ đều là đối tượng, mỗi đối tượng đều phải thuộc một kiểu nào đó. Theo nghĩa này thì function, class, module,… cũng xem là các kiểu trong Python. Phần sau mình chỉ nói về kiểu dữ liệu, tức là kiểu của các đối tượng thực sự chứa dữ liệu (chỗ này hơi rối @@)

2. Những kiểu dữ liệu và cấu trúc dữ liệu thường dùng trong lập trình

Một ngôn ngữ lập trình thường có các kiểu dữ liệu cơ bản (primitive data types) sau:

  • Boolean
  • Character
  • Integer
  • Floating-point number
  • Fixed-point number
  • Enumerated type
  • Datetime

Một số cấu trúc dữ liệu thường thấy là:

  • List
  • Tuple
  • Queue
  • Stack
  • Tree, Heap,…

Việc phân chia rõ ràng data types trong Python tương đối phức tạp. Kể cả việc Python có bao nhiêu “kiểu dữ liệu cơ bản” cũng có nhiều tài liệu trình bày khác nhau. Theo python.org (trang chủ chính thức phát hành Python) thì dữ liệu Python (chính xác là Python 2) có thể chia thành những kiểu sau:python.org (trang chủ chính thức phát hành Python) thì dữ liệu Python (chính xác là Python 2) có thể chia thành những kiểu sau:

  • Numeric types: 
    >>> Liz = [0, 1, 2, 3, 4, 5]
    >>> Liz.append('a')
    [0, 1, 2, 3, 4, 5, 'a']
    8,
    >>> Liz = [0, 1, 2, 3, 4, 5]
    >>> Liz.append('a')
    [0, 1, 2, 3, 4, 5, 'a']
    9,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    0, complex
  • Sequence Types:
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    2,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    3,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    4,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    5,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    6,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    7,
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    8
  • Set Types:
    >>> Tup = tuple('aabc')
    ('a','a','b','c')
    
    >>> Tup.count('a')
    2
    9,
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    0
  • Mapping Types:
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    1

Tuy nhiên, ở mức độ thực hành lập trình, bạn cần nắm rõ 6 kiểu dữ liệu “tiêu chuẩn” sau đây:

  • Python Numbers
  • Python List
  • Python Tuple
  • Python Strings
  • Python Set
  • Python Dictionary

Một điều hết sức quan trọng đó là: Python là ngôn ngữ động, vì thế biến sẽ tự động thay đổi kiểu phụ thuộc vào giá trị mà nó trỏ đến.

3.1 Python Numbers

Kiểu số trong Python gồm có: intger, float, long và complex.

>>> a = 1
>>> type(a)


>>> a = 2.0
>>> type(a)


>>> a = 3L
>>> type(a)


>>> a = 4+5j
>>> type(a)

3.2 Python List

Là một trong những kiểu dư liệu được dùng nhiều nhất trong Python. Sau đây là một số lưu ý về list:list:

  • Là dãy có thứ tự, chỉ số bắt đầu từ số 0có thứ tự, chỉ số bắt đầu từ số 0
  • Rất linh động, các phần tử không nhất thiết cùng kiểu
  • Là mutable data type, tức là các phần tử có thể bị thay đổi tại chỗmutable data type, tức là các phần tử có thể bị thay đổi tại chỗ
  • Tips: 
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    2 sẽ trả về một list 
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    3
>>> Liz = [0, 1, 2, 3, 4, 5]
>>> Liz.append('a')
[0, 1, 2, 3, 4, 5, 'a']

Một list có rất nhiều phương thức để thao tác với nó. Sau đây là những phương thức thường dùng nhất:  

# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)
4,
# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)
5, 
# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)
6,
# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)
7,
# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)
8

3.3 Python Tuple

Rất giống với List. Một số điểm khác biệt:

  • Tuple là immutableimmutable
  • Tuple sử dụng dấu ngoặc tròn, thay vì dấu ngoặc vuông như của List
  • Tips: Tuple thường dùng để lưu thông tin cố định của đối tượng. Ví dụ: trong numpy, shape của array luôn được lưu bằng tuple, chẳng hạn array 3x3x2 sẽ có shape là
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    9numpy, shape của array luôn được lưu bằng tuple, chẳng hạn array 3x3x2 sẽ có shape là
    # Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
    >>> S = {1, 2, (3,4), 1, 2, "abc"}
    set([1, 2, 'abc', (3, 4)])
    
    # Kiểm tra số phần tử
    >>> len(S)
    4
    
    # Thêm một phần tử vào tập hợp
    >>> S.add(99)
    set([1, 2, 99, 'abc', (3, 4)])
    
    # Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
    S.discard(9)
    9
>>> Tup = tuple('aabc')
('a','a','b','c')

>>> Tup.count('a')
2

3.4 Python String

String trong Python là dãy có thứ tự các ký tự Unicode.dãy có thứ tự các ký tự Unicode.

  • String là immutableimmutable
  • String có thể slicing tương tự như list và tuple
  • String trong Python cũng có các method xử lí chuỗi thông dụng như: 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    0, 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    1, 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    2,…
  • Tips: Method 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    3 của một chuỗi giúp kiểm tra xem chuỗi đó có bắt đầu bằng một ký tự nào đó hay không. Ví du: 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    4 trả về 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    5

3.5 Python Set

Set là kiểu dữ liệu rất đặc biệt trong Python: chứa một tập hợp các phần tử bất kỳ (có thể là số, chuỗi, list, tuple, module, class, một set khác,…)bất kỳ (có thể là số, chuỗi, list, tuple, module, class, một set khác,…)

  • Phần tử trong set không quan trọng thứ tựset không quan trọng thứ tự
  • Phần tử trong set không nhất thiết cùng kiểu dữ liệu
  • Set là kiểu dữ liệu mutablemutable
  • Một số method quan trọng: 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    6, 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    7, 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    8, 
    # Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
    >>> D = {1:[8,8,8], 2:[9,9,9]}
    
    # Thay đổi giá trị một key trong dict
    >>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
    >>> MyPC['OS'] = 'Ubuntu'
    
    # Xem các keys của dict
    >>> MyPC.keys()
    ['model', 'RAM', 'OS', 'Processor']
    9
# Khởi tạo một tập hợp bằng cặp dấu ngoặc móc. Những phần tử trùng lặp sẽ tự động bị loại bỏ
>>> S = {1, 2, (3,4), 1, 2, "abc"}
set([1, 2, 'abc', (3, 4)])

# Kiểm tra số phần tử
>>> len(S)
4

# Thêm một phần tử vào tập hợp
>>> S.add(99)
set([1, 2, 99, 'abc', (3, 4)])

# Xóa một phần tử khỏi tập hợp. Nếu phần tử không có trong tập hợp thì thôi 😛
S.discard(9)

3.6 Python Dictionary

Distionary là kiểu dữ liệu có nhiều ứng dụng trong Python. Dict chứa một tập hợp các cặp key : valuekey : value

  • Dict không quan trọng thứ tự của các cặp key : value không quan trọng thứ tự của các cặp key : value
  • Dict là immutableimmutable
  • Key và value có thể thuộc bất kỳ kiểu nào
  • Tips: Lặp các phần tử của dictionary nhanh hơn rất nhiều lần so với list
# Khởi tạo một dict có 2 cặp key:value. Key là các số nguyên, value là các danh sách
>>> D = {1:[8,8,8], 2:[9,9,9]}

# Thay đổi giá trị một key trong dict
>>> MyPC = {'model':'XPS13', 'RAM':16, 'OS':'Windows', 'Processor':'Intel'}
>>> MyPC['OS'] = 'Ubuntu'

# Xem các keys của dict
>>> MyPC.keys()
['model', 'RAM', 'OS', 'Processor']

Để ôn lại về kiểu dữ liệu mutable và immutable trong Python, mời bạn xem bài viết Python: Phân biệt Mutable vs ImmutablePython: Phân biệt Mutable vs Immutable

4. Kết luận

Python cơ bản có 6 kiểu dữ liệu tiêu chuẩn cần nắm rõ: Numbers, List, Tuple, Strings, Set và Dictionary.

Bài viết này chỉ nhằm mục đích bàn luận về kiểu dữ liệu trong Python. Ngoài những kiểu gốc của Python, những thư viện ngoài có những kiểu dữ liệu tự định nghĩa riêng của nó, dựa trên những kiểu dữ liệu có sẵn. Ví dụ trong numpy, kiểu dữ liệu thường gặp là numpy.ndarray, trong khi kiểu dữ liệu cơ bản trong thư viện pandas là Series và DataFrame.numpy, kiểu dữ liệu thường gặp là numpy.ndarray, trong khi kiểu dữ liệu cơ bản trong thư viện pandas là Series và DataFrame.

5. Tài liệu tham khảo

  • Documentation » The Python Standard Library » Built-in Types
  • Documentation » The Python Standard Library » Data Types
  • Wikipedia, List of data structures’
Hướng dẫn python complex data structures - python cấu trúc dữ liệu phức tạp

TEXmath

NỘI DUNG CHÍNH

  • 1. Một số lưu ý khi nói về kiểu dữ liệu
  • 2. Những kiểu dữ liệu và cấu trúc dữ liệu thường dùng trong lập trình
  • 3. Data types trong Python 
    • 3.1 Python Numbers
    • 3.2 Python List
    • 3.3 Python Tuple
    • 3.4 Python String
    • 3.5 Python Set
    • 3.6 Python Dictionary
  • 4. Kết luận
  • 5. Tài liệu tham khảo