Mảng trong Python là một cấu trúc dữ liệu mạnh mẽ có khả năng lưu trữ nhiều giá trị cùng kiểu. Dù nhiều người thường nhầm lẫn với danh sách (lists) hoặc mảng Numpy, nhưng thực tế mảng trong Python có những đặc điểm riêng. Trong bài viết này, chúng ta sẽ khám phá mảng trong Python là gì và cách triển khai chúng.
I. Mảng trong Python là gì
Mảng là cấu trúc dữ liệu cơ bản có khả năng chứa nhiều giá trị cùng một lúc. Nó là một tập hợp hoặc chuỗi các phần tử cùng kiểu (có thứ tự). Ví dụ:
a = [1.2, 1.3, 2.3]
Chúng ta có thể dễ dàng lặp qua các phần tử trong mảng và truy xuất các giá trị cần thiết bằng cách chỉ định số chỉ mục. Mảng cũng có thể thay đổi, vì vậy, ta có thể thực hiện các thao tác khác nhau theo yêu cầu.
II. Khai báo mảng trong Python
Để tạo mảng, bạn cần sử dụng mô-đun array
. Ví dụ:
import array as arr
a = arr.array('d', [1.2, 3.6, 4.6])
print(a)
Đoạn code trên tạo một mảng với kiểu dữ liệ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à bảng thống kê các kiểu mã phổ biến nhất trong Python:
Mã kiểu | C Type | Python Type | Kích thước tối thiểu (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 |
III. Nhập mảng trong Python
Chúng ta sử dụng chỉ số để truy cập các phần tử của mảng. Chỉ số cũng bắt đầu từ 0, tương tự như trong danh sách 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ứ hai:", a[1])
print("Phần tử cuối cùng:", a[-1])
Kết quả của chương trình sẽ là:
Phần tử đầu tiên: 2
Phần tử thứ hai: 4
Phần tử cuối cùng: 8
Bạn cũng có thể truy cập vào một dải phần tử trong mảng bằng cách sử dụng toán 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 cuối
print(numbers_array[:]) # Phần tử đầu tiên đến cuối cùng
Khi bạn chạy đoạn code trên, kết quả trả về sẽ 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])
IV. Duyệt mảng trong Python
Gói NumPy chứa vòng lặp numpy.nditer
. Đây là một vòng lặp đa chiều hiệu quả, cho phép lặp lại trên một mảng. Mỗi phần tử của mảng được truy cập bằng giao diện Iterator tiêu chuẩn của Python.
Ví dụ 1:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print('Original array is:')
print(a)
print('\n')
print('Modified array is:')
for x in np.nditer(a):
print(x)
Kết quả sẽ là:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
0
5
10
15
20
25
30
35
40
45
50
55
Ví dụ 2:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print('Original array is:')
print(a)
print('\n')
print('Transpose of the original array is:')
b = a.T
print(b)
print('\n')
print('Modified array is:')
for x in np.nditer(b):
print(x)
Kết quả sẽ là:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Modified array is:
0
20
40
5
25
45
10
30
50
15
35
55
- Thứ tự lặp lại: Nếu các phần tử giống nhau được lưu trữ bằng cách sử dụng thứ tự kiểu F, trình vòng lặp sẽ chọn cách hiệu quả hơn để lặp qua một mảng.
Ví dụ 1:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print('Original array is:')
print(a)
print('\n')
print('Transpose of the original array is:')
b = a.T
print(b)
print('\n')
print('Sorted in C-style order:')
c = b.copy(order='C')
print(c)
for x in np.nditer(c):
print(x)
print('\n')
print('Sorted in F-style order:')
c = b.copy(order='F')
print(c)
for x in np.nditer(c):
print(x)
Kết quả sẽ là:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Sorted in C-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0
20
40
5
25
45
10
30
50
15
35
55
Sorted in F-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0
5
10
15
20
25
30
35
40
45
50
55
Ví dụ 2:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print('Original array is:')
print(a)
print('\n')
print('Sorted in C-style order:')
for x in np.nditer(a, order='C'):
print(x)
print('\n')
print('Sorted in F-style order:')
for x in np.nditer(a, order='F'):
print(x)
Kết quả sẽ là:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Sorted in C-style order:
0
5
10
15
20
25
30
35
40
45
50
55
Sorted in F-style order:
0
20
40
5
25
45
10
30
50
15
35
55
- Sửa đổi giá trị mảng
Đối tượng
nditer
có một tham số tùy chọn khác được gọi làop_flags
. Giá trị mặc định của nó là chỉ đọc, nhưng có thể được đặt ở chế độ chỉ đọc-ghi hoặc chỉ ghi. Điều này sẽ cho phép sửa đổi các phần tử mảng bằng cách sử dụng trình lặp này. Ví dụ:
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print('Original array is:')
print(a)
print('\n')
print('Modified array is:')
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2*x
print(a)
Kết quả sẽ là:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
[[ 0 10 20 30]
[40 50 60 70]
[80 90 100 110]]
- Vòng lặp ngoài:
V. Nối Mảng Trong Python
Mảng cũng có thể được hợp nhất bằng cách thực hiện phép nối mảng. Bất kỳ hai mảng nào cũng có thể được hợp nhất bằng toán tử +
.
Ví dụ:
import array as arr
a = arr.array('d', [1.1 , 2.1 ,3.1,2.6,7.8])
b = arr.array('d', [3.7,8.6])
c = arr.array('d')
c = a + b
print("Mảng c =",c)
Kết quả:
Mảng c = array('d', [1.1, 2.1, 3.1, 2.6, 7.8, 3.7, 8.6])
Có thể thấy, mảng c
là sự kết hợp của các phần tử của mảng a
và b
.
VI. Sắp xếp mảng trong Python
Hãy viết chương trình Python để sắp xếp các phần tử trong mảng theo thứ tự tăng dần và giảm dần, danh sách các phần tử do người dùng nhập vào và phải là danh sách các số nguyên.
Qua bài tập sắp xếp mảng Python này sẽ giúp bạn hiểu được thuật toán sắp xếp nổi bọt, bằng cách sử dụng hai vòng lặp for lồng nhau để sắp xếp thứ tự cho chúng.
Thuật toán này khá đơn giản cho trường hợp sắp xếp tăng dần như sau:
- Vòng lặp 1 sẽ lặp qua lần lượt các phần tử trong mảng,
- Mỗi lần lặp sẽ lặp tiếp các phần tử phía sau bằng cách sử dụng thêm một vòng lặp nữa,
- Nếu có phần tử phía sau nào bé hơn phần tử đang lặp ở vòng 1 thì đổi vị trí cho chúng.
- Cứ như vậy cho tới khi vòng lặp 1 kết thúc thì ta thu được kết quả.
Trường hợp sắp xếp giảm dần thì ta chỉ cần đổi điều kiện từ bé hơn sang lớn hơn.
Để đơn giản hóa, trong ví dụ này mình chỉ làm trường hợp sắp xếp tăng dần thôi nhé.
Xem chương trình mẫu dưới đây:
# SẮP XẾP TĂNG DẦN
numbers = [3, 45, 2, 46, 5, 25, 65, 8, 57, 67]
length = len(numbers)
# Lặp từ phần tử đầu đến kế cuối,
# Vì khi đến phần tử cuối là đã sắp xếp thành công
for i in range(0, length - 1):
for j in range(i + 1, length):
if (numbers[i] > numbers[j]):
# Hoán đổi vị trí
tmp = numbers[i]
numbers[i] = numbers[j]
numbers[j] = tmp
print(numbers)
# Kết quả: [2, 3, 5, 8, 25, 45, 46, 57, 65, 67]
Áp dụng vào chương trình chính:
# Học Python tại Freetuts.net
# Author: Cường Nguyễn
# SẮP XẾP TĂNG DẦN
def sap_xep_tang_dan(numbers):
length = len(numbers)
# Lặp từ phần tử đầu đến kế cuối,
# Vì khi đến phần tử cuối là đã sắp xếp thành công
for i in range(0, length - 1):
for j in range(i + 1, length):
if (numbers[i] > numbers[j]):
# Hoán đổi vị trí
tmp = numbers[i]
numbers[i] = numbers[j]
numbers[j] = tmp
return numbers
# Chương trình chính
print("Chương trình sắp xếp mảng Python")
print("Bạn muốn tạo mảng có bao nhiêu phần tử", end=":")
length = int(input())
numbers = []
for i in range(0, length):
print("Nhập phần tử thứ ", (i + 1), end=":")
numbers.append(int(input()))
print("Mảng trước khi sắp xếp")
print(numbers)
print("Mảng sau khi sắp xếp")
print(sap_xep_tang_dan(numbers))
Chạy chương trình, kết quả sẽ như sau:
Chương trình sắp xếp mảng Python
Bạn muốn tạo mảng có bao nhiêu phần tử:5
Nhập phần tử thứ 1:8
Nhập phần tử thứ 2:2
Nhập phần tử thứ 3:4
Nhập phần tử thứ 4:7
Nhập phần tử thứ 5:1
Mảng trước khi sắp xếp
[8, 2, 4, 7, 1]
Mảng sau khi sắp xếp
[1, 2, 4, 7, 8]
VII. Đảo ngược mảng trong Python
Hướng dẫn tất cả các cách đảo ngược list trong Python. Bạn sẽ học được tất cả cách đảo ngược list trong Python bằng cách sử dụng phương thức reverse()
, hàm reverse
trong Python cũng như bằng cách cắt (slice) list Python sau bài học này.
Chúng ta có 3 phương pháp để đảo ngược list trong Python như sau:
- Phương thức
reverse()
: đảo ngược list ban đầu trong Python - Cắt (slice) list: Đảo ngược list và tạo ra một list mới
- Hàm
reverse
trong Python: Đảo ngược list và tạo ra một trình lặp
Chúng ta sẽ cùng tìm hiểu các phương pháp này dưới đây:
a) Đảo ngược list ban đầu trong Python | Phương thức reverse()
Phương thức reverse()
trong Python sẽ đảo ngược thứ tự các phần tử trong list ban đầu. Đây là một quá trình tự phá hủy (Destructive processing) và tái tạo lại list ban đầu với các phần tử theo thứ tự ngược lại.
Chúng ta sử dụng phương thức reverse()
trong Python với cú pháp sau đây:
orinary_list.reverse()
Trong đó orinary_list
là list ban đầu cần đảo ngược lại.
Ví dụ, chúng ta dùng phương thức reverse()
để đảo ngược một dãy số trong Python như sau:
orinary_list = [1, 2, 3, 4, 5]
orinary_list.reverse()
print(orinary_list)
# Output: [5, 4, 3, 2, 1]
Tương tự, chúng ta sử dụng reverse()
để đảo ngược list trong Python phần tử là chuỗi như sau:
mylist = ['Ali' , 'Bob' , 'Eva' , 'Adam']
mylist.reverse()
print(mylist)
# Output: ['Adam', 'Eva', 'Bob', 'Ali']
Lưu ý, sau khi thực hiện phương thức reverse()
thì list ban đầu sẽ bị thay đổi, nhưng bản thân phương thức reverse()
sẽ trả về giá trị None như sau:
print(org_list.reverse())
# Output: None
Nếu không biết kết quả trả về của phương thức reverse()
là None, bạn rất dễ mắc lỗi logic trong chương trình. Ví dụ như khi muốn in ra list đảo ngược trong Python, thay vì in list đã được đảo ngược bằng reverse()
thì bạn lại in ra kết quả của phương thức reverse()
như sau:
l = ['a' , 'b', 'c']
# Cách in sai:
print(l.reverse()) # Output: None.
# Cách in đúng:
l.reverse()
print(l) # Output: ['a', 'b', 'c']
b) Đảo ngược list và tạo ra một list mới trong Python | Cắt (slice) list
Chúng ta cũng có thể ứng dụng chức năng cắt (slice) list để đảo ngược list trong Python.
Nếu chúng ta chỉ định đối số step = -1
khi Cắt (slice) list trong Python, list được cắt ra sẽ có thứ tự ngược lại với list ban đầu. Lợi dụng tính chất này, chúng ta có thể đảo ngược list trong Python như ví dụ sau:
orinary_list = [1, 2, 3, 4, 5]
new_list = orinary_list[::-1]
print(orinary_list)
print(new_list)
# Output:
# [1, 2, 3, 4, 5]
# [5, 4, 3, 2, 1]
Lưu ý là khác với phương thức resort()
ở trên, khi cắt (slice) list chúng ta sẽ tạo ra một list mới có phần tử ngược lại với list ban đầu, còn bản thân list ban đầu thì không bị thay đổi.
c) Đảo ngược list và tạo ra trình lặp trong Python | Hàm reversed
trong Python
Hàm reversed
trong Python là một hàm cài đặt sẵn, có chức năng lấy các phần tử trong list chỉ định và tạo ra một trình lặp với thứ tự các phần tử trong đó ngược lại với list ban đầu.
Kết hợp sử dụng hàm list()
trong Python, chúng ta có thể chuyển trình lặp - kết quả của hàm reversed()
thành một list mới, với thứ tự phần tử ngược với list ban đầu.
Chúng ta sử dụng hàm reversed()
trong Python với cú pháp sau đây:
list_iterator = reversed(orinary_list)
Trong đó orinary_list
là list ban đầu cần đảo thứ tự và list_iterator
là trình lặp được tạo ra.
Ví dụ cụ thể:
orinary_list = ['a' , 'b', 'c' , 'd' , 'e']
print(orinary_list) # Output: ['a' , 'b', 'c' , 'd' , 'e']
list_iterator = reversed(orinary_list)
print(list_iterator) # Output:
Lưu ý là hàm reversed()
sẽ trả về một trình lặp chứ không phải là một list. Do đó khi in trình lặp ra thì kết quả sẽ như ở trên. Để lấy và in ra các phần tử trong trình lặp, chúng ta cần phải dùng vòng lặp for
như sau:
for i in list_iterator:
print(i)
# Output:
# e
# d
# c
# b
# a
Kết hợp với hàm list()
trong Python, chúng ta có thể biến trình lặp ở trên thành một list mới có thứ tự phần tử ngược lại với list ban đầu như sau:
new_list = list(list_iterator)
print(new_list)
# Output: ['e', 'd', 'c', 'b', 'a']
Một cách tổng quát, chúng ta đảo ngược list trong Python bằng hàm reversed()
với cách viết như sau:
orinary_list = ['a' , 'b', 'c' , 'd' , 'e']
new_list = list(reversed(orinary_list))
print(orinary_list)
print(new_list)
# Output:
# ['a', 'b', 'c', 'd', 'e']
# ['e', 'd', 'c', 'b', 'a']
VIII. Tính tổng trong mảng Python
Hàm tích hợp sẵn sum()
trong Python trả về tổng của tất cả các số trong iterable.
Cú pháp hàm sum()
sum(iterable, start)
Hàm sum()
bắt đầu cộng từ trái qua phải.
iterable
: các iterable được tích hợp sẵn (như list, string, dict) cần tính tổng, thường là các số.start
: giá trị được cộng thêm vào giá trị trả về từ iterable. Giá trị mặc định là 0.
Giá trị trả về từ sum()
Hàm sum()
trả về tổng của start
và các item thành phần của iterable
.
Ví dụ: Cách sum()
hoạt động trong Python
numbers = [2.5, 3, 4, -5]
# Không truyền tham số start
numbersSum = sum(numbers)
print(numbersSum) # Output: 4.5
# start = 10
numbersSum = sum(numbers, 10)
print(numbersSum) # Output: 14.5
IX. Các Thao Tác Với Mảng Trong Python
Thay đổi giá trị của phần tử
Để thay đổi giá trị của một phần tử trong mảng, chúng ta chỉ cần truy cập vào phần tử đó thông qua chỉ số và gán giá trị mới.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
thislist[1] = "blackcurrant"
print(thislist)
Kết quả:
['apple', 'blackcurrant', 'cherry']
Đếm chiều dài của mảng
Để đếm chiều dài của mảng, chúng ta sử dụng hàm len()
.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
print(len(thislist))
Kết quả:
3
Lặp qua từng phần tử
Chúng ta có thể sử dụng vòng lặp for
hoặc vòng lặp while
để lặp qua từng phần tử trong mảng. Kết hợp với hàm len()
để đếm tổng số phần tử của mảng.
Ví dụ:
fruits = ['banana', 'apple', 'mango']
for index in range(len(fruits)):
print('Current fruit:', fruits[index])
Có một cách đơn giản hơn là bạn sử dụng cú pháp cơ bản như sau:
fruits = ['banana', 'apple', 'mango']
for fruit in fruits:
print('Fruit:', fruit)
Kiểm tra một giá trị có tồn tại trong mảng
Để kiểm tra xem một giá trị có tồn tại trong mảng hay không, chúng ta sử dụng lệnh if
. Ví dụ: kiểm tra chuỗi "Apple" có tồn tại trong mảng không.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
if "apple" in thislist:
print("Apple có trong danh sách này")
Thêm phần tử vào mảng
Nếu trong PHP chúng ta sử dụng cú pháp $var[] = value
để thêm một phần tử vào array, thì trong Python chúng ta phải sử dụng phương thức append()
của List.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
thislist.append("orange")
print(thislist)
Kết quả:
['apple', 'banana', 'cherry', 'orange']
Xóa phần tử ra khỏi mảng
Cách 1: Để xóa một phần tử khỏi List, chúng ta sử dụng phương thức remove()
được tích hợp sẵn trong List.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
thislist.remove("banana")
print(thislist)
Kết quả:
['apple', 'cherry']
Cách 2: Để xóa phần tử có số thứ tự index nào đó trong List, chúng ta sử dụng phương thức pop()
. Nếu không truyền index, phương thức này sẽ xóa phần tử cuối cùng.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
thislist.pop(1)
print(thislist)
Kết quả:
['apple', 'cherry']
Cách 3: Sử dụng từ khóa del
.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
del thislist[0]
print(thislist)
Kết quả:
['banana', 'cherry']
Thiết lập List rỗng
Để thiết lập List rỗng, chúng ta sử dụng phương thức clear()
.
Ví dụ:
thislist = ["apple", "banana", "cherry"]
thislist.clear()
print(thislist)
Kết quả:
[]
Các thao tác khác với mảng trong Python cũng tương tự như danh sách (list), với phương thức và phép toán tương ứng.