Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cấu trúc dữ liệu Python (Python Data Structures)

Cấu trúc dữ liệu (Data structures) là yếu tố thiết yếu trong lập trình. Chúng được dùng để tổ chức, lưu trữ, và quản lý dữ liệu theo cách hiệu quả để truy xuất và sửa đổi.

Hãy tưởng tượng việc giặt quần áo hàng tuần. Lý tưởng nhất, bạn tách vớ, áo, quần, và đồ mềm trong các ngăn kéo riêng để dễ truy cập vào sáng trước khi ra ngoài. Bạn đang chuẩn bị với một cấu trúc dữ liệu. Bây giờ, hãy tưởng tượng ném tất cả đồ đạc vào một ngăn kéo duy nhất hoặc nhiều ngăn không có tổ chức. Bạn nghĩ sẽ mất bao lâu để chuẩn bị cho công việc hoặc buổi tối? Đó là chuẩn bị không có cấu trúc dữ liệu.

Trong bài viết này, chúng ta đi sâu vào các cấu trúc dữ liệu tích hợp sẵn Python cung cấp.

Các cấu trúc dữ liệu tích hợp sẵn trong Python

Cấu trúc dữ liệu tích hợp sẵn trong Python bao gồm: danh sách (lists), từ điển (dictionaries), tuple, và tập hợp (sets).

Danh sách (Lists)

Danh sách là cấu trúc dữ liệu có thể thay đổi (mutable) có thể chứa các phần tử khác nhau. Nói cách khác, một danh sách đơn lẻ có thể chứa nhiều kiểu dữ liệu khác nhau.

list = ['string', 300, (2, 4), 'that previous data type was a tuple']

Cấu trúc dữ liệu danh sách có 11 phương thức dùng để thêm, xóa, hoặc thao tác trên chính danh sách.

Thêm phần tử vào danh sách

  • append(): Phương thức append() thêm một mục đơn lẻ vào danh sách
list = ['string, next is tuple', (2, 1), 3]
list.append(500)
print(list)  # prints ['string, next is tuple', (2, 1), 3, 500]
  • extend(): Phương thức extend() mở rộng danh sách bằng tất cả mục từ đối tượng có thể lặp. Nó khác append() như sau.
list = ['string, next is tuple', (2, 1), 3]
list.append((8, 9))
print(list)  # prints ['string, next is tuple', (2, 1), 3, (8, 9)]
# Notice that append() leave (8, 9) as a tuple
list = ['string, next is tuple', (2, 1), 3]
list.extend((8, 9))
print(list)  # prints ['string, next is tuple', (2, 1), 3, 8, 9]
# Notice that extend() did not leave (8, 9) as a tuple
  • insert(): Phương thức insert() chèn mục tại vị trí hoặc chỉ mục cho trước. Tham số đầu là chỉ mục phần tử cần chèn, tham số hai là phần tử bản thân.
list = ['string, next is tuple', (2, 1), 3]
list.insert(0, 700)
print(list)  # prints [700, 'string, next is tuple', (2, 1), 3]
# inserted 700 in the 0 index

Xóa phần tử khỏi danh sách

  • remove(): Phương thức remove() xóa mục đầu tiên trong danh sách chứa giá trị nó nhận.
list = ['string, next is tuple', (2, 1), 3, 8, 3]
list.remove(3)
print(list)  # prints ['string, next is tuple', (2, 1), 8, 3]
  • pop(): Phương thức pop() xóa giá trị tại vị trí cho trước, tuy nhiên nếu không cho chỉ mục, nó xóa mục cuối.
list = ['string, next is tuple', (2, 1), 3]
list.pop(0)
print(list)  # prints [(2, 1), 3]
list = ['string, next is tuple', (2, 1), 3]
list.pop()
print(list)  # prints ['string, next is tuple', (2, 1)]
  • clear(): Phương thức clear() không nhận tham số. Nó xóa tất cả mục khỏi danh sách.
list = ['string, next is tuple', (2, 1), 3]
list.clear()
print(list)  # prints []

Các phương thức danh sách khác

  • index(): Phương thức index() trả về chỉ mục của giá trị cho trước.
list = [8, 20, 1, 9, 2, 3, 937, 0]
print(list.index(9))  # prints 3
  • count(): Phương thức count() đếm số lần giá trị xuất hiện trong danh sách.
list = [8, 20, 1, 8, 2, 8, 937, 8]
print(list.count(8))  # prints 4
  • sort(): Phương thức sort() có thể dùng có hoặc không có tham số và dùng cho tùy chỉnh sắp xếp.
list = [8, 20, 1, 9, 2, 3, 937, 0]
list.sort()
print(list)  # prints [0, 1, 2, 3, 8, 9, 20, 937]
list = [8, 20, 1, 9, 2, 3, 937, 0]
list.sort(reverse=True)
print(list)  # prints [937, 20, 9, 8, 3, 2, 1, 0]
  • reverse(): Phương thức reverse đảo ngược các phần tử danh sách tại chỗ, giống như sort với tham số tùy chỉnh.
list = [8, 20, 1, 9, 2, 3, 937, 0]
list.reverse()
print(list)  # prints [0, 937, 3, 2, 9, 1, 20, 8]
  • copy(): Phương thức copy() đơn giản trả về bản sao danh sách.
list = [8, 20, 1, 9, 2, 3, 937, 0]
list.copy()
print(list)  # prints [8, 20, 1, 9, 2, 3, 937, 0]

Tuple

Tuple là dữ liệu được giữ trong ngoặc đơn. Khác với danh sách, chúng không thể thay đổi (immutable - không khả thi thay đổi), và nhanh hơn danh sách. Vì bất biến, chúng ta cũng có thể dùng chúng làm khóa trong từ điển. Tuple cũng dùng khi muốn trả về nhiều kết quả từ hàm.

Chúng ta có thể thêm dữ liệu vào tuple bằng cách dùng nối (concatenation).

tuple = (1, 2, 3)
print(tuple)  # prints (1, 2, 3)
tuple = tuple + (4, 5, 6)
print(tuple)  # prints (1, 2, 3, 4, 5, 6)

Từ điển (Dictionaries)

Từ điển là cấu trúc dữ liệu giữ cặp khóa-giá trị như object trong JavaScript. Giống danh sách, cấu trúc này có thể thay đổi (mutable), nghĩa là chúng ta có thể thay đổi dữ liệu.

Ví dụ cặp khóa-giá trị là đặc điểm một người và mô tả đặc điểm đó. Tên, tuổi, chiều cao, cân nặng đều có thể là khóa. Josh, 33, 5'10, 180 lbs, có thể là giá trị cho khóa đó.

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}

Vì từ điển có thể thay đổi, chúng ta có thể đổi 'Josh' thành tên khác.

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict['name'] = 'Patrick'
print(dict)  # prints {'name': 'Patrick', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}

Chúng ta có thể thêm giá trị bằng cách tạo cặp khóa-giá trị mới.

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict['location'] = 'San Francisco'
print(dict)  # prints {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs', 'location': 'San Francisco'}

Chúng ta cũng có thể xóa cặp khóa-giá trị bằng từ khóa del, pop(), hoặc popitem(). Lưu ý với từ điển pop() phải nhận tham số, nên cần popitem() để xóa cặp khóa-giá trị cuối.

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
del dict['name']
print(dict)  # prints {'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict.pop('name')
print(dict)  # prints {'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
dict.popitem()
print(dict)  # prints {'name': 'Josh', 'age': 33, 'height': "5'10"}

Chúng ta cũng có thể in riêng khóa hoặc riêng giá trị của từ điển.

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
print(dict.keys())  # prints dict_keys(['name', 'age', 'height', 'weight'])
dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
print(dict.values())  # prints dict_values(['Josh', 33, "5'10", '180 lbs'])

Để in dưới dạng cặp khóa-giá trị, dùng phương thức items().

dict = {'name': 'Josh', 'age': 33, 'height': "5'10", 'weight': '180 lbs'}
print(dict.items())  # prints dict_items([('name', 'Josh'), ('age', 33), ('height', "5'10"), ('weight', '180 lbs')])

Tập hợp (Sets)

Set là tập hợp có thể thay đổi, không có thứ tự, các phần tử duy nhất, nghĩa là không bao gồm phần tử trùng lặp. Set trông như từ điển vì cả hai giữ dữ liệu trong ngoặc nhọn, nhưng khác từ điển, set không có cặp khóa-giá trị.

set = {1, 2, 2, 2, 3, 3, 4, 4}
print(set)  # prints {1, 2, 3, 4}

Chúng ta có thể thêm phần tử vào set bằng phương thức add().

set = {1, 2, 2, 2, 3, 3, 4, 4}
set.add(5)
print(set)  # prints {1, 2, 3, 4, 5}

Có bốn phương thức khác khi dùng set: union(), intersection(), difference(), và symmetric_difference().

  • union(): Hợp nhất hai set khác nhau, lấy chung và tạo thành một set đơn không trùng lặp.
set = {1, 2, 2, 2, 3, 3, 4, 4}
set.add(5)
print(set)  # prints {1, 2, 3, 4, 5}
anotherSet = {3, 3, 4, 4, 5, 5, 6}
print(set.union(anotherSet))  # prints {1, 2, 3, 4, 5, 6}
  • intersection(): Tìm phần tử chung trong cả hai set.
set = {1, 2, 2, 2, 3, 3, 4, 4}
set.add(5)
print(set)  # prints {1, 2, 3, 4, 5}
anotherSet = {3, 3, 4, 4, 5, 5, 6}
print(set.intersection(anotherSet))  # prints {3, 4, 5}
  • difference(): Làm ngược intersection - lấy bỏ tất cả phần tử chung và in phần còn lại từ set đầu.
set = {1, 2, 2, 2, 3, 3, 4, 4}
set.add(5)
print(set)  # prints {1, 2, 3, 4, 5}
anotherSet = {3, 3, 4, 4, 5, 5, 6}
print(set.difference(anotherSet))  # prints {1, 2}
  • symmetric_difference(): Giống difference nhưng lấy phần khác biệt của cả hai set.
set = {1, 2, 2, 2, 3, 3, 4, 4}
set.add(5)
print(set)  # prints {1, 2, 3, 4, 5}
anotherSet = {3, 3, 4, 4, 5, 5, 6}
print(set.symmetric_difference(anotherSet))  # prints {1, 2, 6}