Mảng trong Python

Python

Mảng trong Python được dùng khá phổ biến. Dưới đây là mọi điều bạn cần biết về array trong Python.

Tạo mảng trong Python là một tập hợp mục được lưu trữ tại các vị trí bộ nhớ liền kề. Ý tưởng ở đây là lưu trữ nhiều mục cùng loại với nhau. Hành động này hỗ trợ người dùng tính toán vị trí của từng phần tử dễ dàng hơn bằng cách thêm một giá trị bù vào giá trị cơ sở, tức là vị trí bộ nhớ của phần tử đầu tiên trong mảng (thường được biểu thị bằng tên của mảng).

Hiểu đơn giản, bạn có thể tưởng tượng mảng trong Python là một dãy cầu thang nơi mà mỗi bậc được đặt một giá trị. Tại đây, bạn có thể xác định vị trí của bất kỳ người bạn bằng cách đếm số bậc chứa giá trị. Mảng có thể được mô đun tên array xử lý trong Python. Chúng có thể hữu ích khi bạn chỉ phải xử lý một giá trị kiểu dữ liệu. Một người dùng có thể xem list là mảng. Tuy nhiên, họ không thể giới hạn kiểu thành phần được lưu trong danh sách. Nếu tạo mảng bằng mô đun array, toàn bộ thành phần của mảng phải thuộc cùng một kiểu.

Ghi chú: Nếu bạn muốn tạo mảng thực sự trong Python, bạn cần phải sử dụng cấu trúc dữ liệu mảng của NumPy. Để giải quyết các vấn đề toán học thì mảng NumPy sẽ hiệu quả hơn.

List và mô-đun array trong Python

Bạn có thể thao tác với list giống như mảng nhưng không thể ép kiểu phần tử được lưu trữ trong list. Ví dụ:

a= [1, 3.5, "Hello"]

Nếu bạn tạo mảng sử dụng mô-đun array, tất cả các phần tử của mảng phải có cùng kiểu số.

import array as arr
a = arr.array('d', [1, 3.5, "Hello"]) // Chạy code này sẽ báo lỗi

Làm thế nào để tạo mảng trong Python?

Từ những ví dụ trên bạn có thể đoán được, chúng ta cần nhập mô-đun array để tạo các mảng. Ví dụ:

import array as arr
a = arr.array('d',[1.1, 3.5, 4.5]) print(a)

Code trên tạo mảng có kiểu float. Chữ ‘d’ là mã kiểu, quyết định kiểu của mảng trong quá trình tạo. Dưới đây là những mã kiểu thường dùng:

Mã kiểu C Type Python Type Kích thước tối thiểu tính theo byte
'b' signed char int 1
'B' unsigned char int 1
'u' Py_UNICODE Unicode character 2
'h' signed short int 2
'H' unsigned short int 2
'i' signed int int 2
'I' unsigned int int 2
'l' signed long int 4
'L' unsigned long int 4
'f' float float 4
'd' double float 8

Ta sẽ không thảo luận về các kiểu dữ liệu C khác nhau trong bài này. Ta sẽ dùng mã ‘i’ cho số nguyên và ‘d’ cho số thập phân trong toàn bài.

Ghi chú: Mã code ‘u’ cho các ký tự Unicode không còn được chấp nhận từ phiên bản Python 3.3. Tránh sự dụng nó khi có thể.

Làm sao để truy cập vào các phần tử của mảng?

Chúng ta sử dụng index để truy cập đến các phần tử của mảng. Index cũng bắt đầu từ 0, tương tự như trong list Python.

import array as arr 
a = arr.array('i', [2, 4, 6, 8]) 
print("Phần tử đầu tiên:", a[0]) 
print("Phần tử thứ 2:", a[1]) 
print("Phần tử cuối cùng:", a[-1])

Chạy chương trình trên ta được:

Phần tử đầu tiên: 2
Phần tử thứ 2: 4
Phần tử cuối cùng: 8

Bạn có thể truy cập vào một dải phần tử trong mảng, sử dụng toán tử cắt lát :.

import array as arr 
numbers_list = [5, 85, 65, 15, 95, 52, 36, 25] 
numbers_array = arr.array('i', numbers_list) 
print(numbers_array[2:5]) # Phần tử thứ 3 đến 5 
print(numbers_array[:-5]) # Phần tử đầu tiên đến 4 
print(numbers_array[5:]) # Phần tử thứ 6 đến hết 
print(numbers_array[:]) # Phần tử đầu tiên đến cuối cùng

Khi bạn chạy code trên sẽ nhận được output là:

array('i', [65, 15, 95])
array('i', [5, 85, 65])
array('i', [52, 36, 25])
array('i', [5, 85, 65, 15, 95, 52, 36, 25])

Thay đổi, thêm phần tử trong mảng Python

Mảng có thể thay đổi, các phần tử của nó có thể thay đổi theo cách tương tự như list.

import array as arr 
numbers = arr.array('i', [1, 1, 2, 5, 7, 9]) 

# thay đổi phần tử đầu tiên 
numbers[0] = 0 
print(numbers) 
# Output: array('i', [0, 1, 2, 5, 7, 9]) 

# thay phần tử thứ 3 đến thứ 5 
numbers[2:5] = arr.array('i', [4, 6, 8]) 
print(numbers) 
# Output: array('i', [0, 1, 4, 6, 8, 9])

Bạn có thêm một mục vào list sử dụng append() hoặc thêm vài mục sử dụng extend():

import array as arr 
numbers = arr.array('i', [3, 5, 7]) 
numbers.append(4) 
print(numbers) # Output: array('i', [3, 5, 7, 4]) 
# extend() nối vào cuối mảng 
numbers.extend([5, 6, 7]) 
print(numbers) # Output: array('i', [3, 5, 7, 4, 5, 6, 7])

2 mảng cũng có thể nối lại thành một nhờ toán tử +:

import array as arr 
mang_le = arr.array('i', [3, 5, 7]) 
mang_chan = arr.array('i', [2, 6, 8]) 
numbers = arr.array('i') # tạo mảng trống 
numbers = mang_le + mang_chan 
# Code by quantrimang.com 
print(numbers) 
# Output: array('i', [3, 5, 7, 2, 6, 8])

Xóa phần tử của mảng trong Python

Để xóa một hoặc nhiều phần tử của mảng ta sử dụng lệnh del.

import array as arr 
number = arr.array('i', [1, 3, 3, 5, 7]) 
del number[2] # xóa phần tử thứ 3 
print(number) # Output: array('i', [1, 3, 5, 7]) 
del number # xóa toàn bộ mảng 
print(number) # Error: array 'number' is not defined

Có thể sử dụng remove() để xóa mục đã cho hoặc pop() để xóa mục với index cho trước:

import array as arr 
numbers = arr.array('i', [1, 1, 3, 5, 9]) 
numbers.remove(1) 
print(numbers) # Output: array('i', [1, 3, 5, 9]) 
print(numbers.pop(2)) # Output: 12 
print(numbers) # Output: array('i', [1, 3, 9])

Độ phức tạp khi loại bỏ array trong Python

Trong mảng của Python, bạn có nhiều cách để in toàn bộ mảng với tất cả các nhân tố, thế nhưng để in một phạm vi nhân tố cụ thể từ mảng, bạn cần dùng toán tử Slice. Toán tử slice được thực hiện trên mảng cùng với dấu hai chấm (:). Để in các nhân tố ngay từ đầu tới mảng dùng [:Index], để in các nhân tố ở cuối dùng [:-Index], để in các nhân tố từ index cụ thể cho tới cuối dùng [Index:], để in các nhân tố trong một phạm vi, dùng [Start Index:End Index] và để in toàn bộ danh sách bằng toán tử slice, dùng [:]. Ngoài ra, để in toàn bộ mảng theo thứ tự đảo ngược, hãy sử dụng [::-1].

Ví dụ:

# Ví dụ chứng minh độ phức tạp khi xóa phần tử trong mảng 
# Chia tách phần tử trong mảng
# Nhập mô đun mảng
import array as arr
# Tạo danh sách
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = arr.array('i', l)
print("Initial Array: ")
for i in (a):
    print(i, end=" ")

# In các nhân tố của một mảng
# Dùng toán tử Slice 
Sliced_array = a[3:8]
print("\nSlicing elements in a range 3-8: ")
print(Sliced_array)
 # In các nhân tố từ điểm xác định trước tới cuối
Sliced_array = a[5:]
print("\nElements sliced from 5th "
      "element till the end: ")
print(Sliced_array)
 # In các nhân tố từ điểm bắt đầu tới cuối
Sliced_array = a[:]
print("\nPrinting all elements using slice operation: ")
print(Sliced_array)

Kết quả:

Mảng ban đầu:
1 2 3 4 5 6 7 8 9 10
Tách các nhân tố trong mảng 3-8:
array('i', [4, 5, 6, 7, 8])
Tách nhân tố trong mảng từ thứ 5 tới cuối:
array('i', [6, 7, 8, 9, 10])

In tất cả các nhân tố bằng toán tử slice:
array('i', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

Lặp các thành phần trong mảng

Bạn có thể dùng vòng lặp for in qua tất cả các thành phần của một mảng. Ví dụ:
In từng mục trong mảng cars:

for x in cars:
  print(x)

Các phương thức mảng trong Python

Python có sẵn một bộ các phương thức cho bạn dùng trên lists/arrays (danh sách/mảng).

Phương thức Mô tả
append() Thêm một phần tử vào cuối danh sách
clear() Xóa tất cả phần tử khỏi danh sách
copy() Trả về một bản sao danh sách
count() Trả về số của các thành phần với giá trị cụ thể
extend() Thêm các phần tử vào danh sách (hoặc có thể lặp lại bất kỳ) vào cuối danh sách hiện tại
index() Trả về chỉ mục của phần tử đầu tiên với giá trị cụ thể
insert() Thêm một phần tử vào vị trí cụ thể
pop() Loại bỏ phần tử ở vị trí nhất định
remove() Loại bỏ mục đầu tiên với giá trị cụ thể
reverse() Đảo ngược thứ tự của danh sách
sort() Phân loại danh sách

Lưu ý: Python không có sẵn hỗ trợ cho các mảng (array), thay vào đó, bạn có thể dùng Python Lists.

Khi nào thì sử dụng mảng?

List linh hoạt hơn mảng, chúng có thể lưu trữ phần tử với nhiều kiểu dữ liệu khác nhau, bao gồm cả chuỗi. List cũng nhanh hơn mảng, vậy thì tại sao lại cần dùng mảng? Nếu bạn phải thực hiện những phép tính toán toán học trên mảng và ma trận, bạn nên sử dụng thư viện NumPy. Trừ khi thực sự cần đến mảng (mô-đun mảng có thể cần để giao tiếp với các code C), nếu không đừng sử dụng chúng.

Leave a Reply

Your email address will not be published. Required fields are marked *