Mảng trong Python

Mảng trong Python là gì? Cách dùng mảng Python như thế nào? Hãy cùng Quantrimang.com tìm hiểu nhé!

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ểuC TypePython TypeKích thước tối thiểu tính theo byte
'b'signed charint1
'B'unsigned charint1
'u'Py_UNICODEUnicode character2
'h'signed shortint2
'H'unsigned shortint2
'i'signed intint2
'I'unsigned intint2
'l'signed longint4
'L'unsigned longint4
'f'floatfloat4
'd'doublefloat8

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.

So sánh Lists và Arrays trong Python

Trong Python, bạn có thể xem list là mảng. Tuy nhiên, bạn không thể hạn chế kiểu phần tử được lưu trong một list. Ví dụ:

# phần tử của các kiểu khác nhau
a = [1, 3.5, "Hello"]

Nếu tạo mảng bằng mô đun array, toàn bộ phần tử của mảng phải có cùng kiểu số.

import array as arr
# Error
a = arr.array('d', [1, 3.5, "Hello"])

Kết quả:

Traceback (most recent call last):
File "<string>", line 3, in <module>
a = arr.array('d', [1, 3.5, "Hello"])
TypeError: must be real number, not str

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.

Vậy các trường hợp dùng mảng được tạo từ mô đun mảng Python là gì?

Kiểu array.array chỉ là một wrapper nhỏ trên mảng C mà cung cấp khả năng lưu trữ hiệu quả về không gian của kiểu dữ liệu loại C. Nếu cần phân bổ một mảng mà bạn biết là sẽ không đổi thì các mảng có thể chạy nhanh hơn và dùng ít bộ nhớ hơn list.

Trừ khi không thực sự cần mảng (có thể cần mô đun mảng để can thiệp vào code C), sử dụng mô đun mảng ở đây không cần thiết.

Thứ Bảy, 21/10/2023 11:06
4,228 👨 160.886
0 Bình luận
Sắp xếp theo
    ❖ Python