Mảng Trong Python

Mảng Trong Python

Mảng trong Python là loại cấu trúc dữ liệu có thể chứa nhiều giá trị cùng kiểu. Thông thường, chúng bị hiểu sai thành những lists hoặc mảng Numpy. Về mặt kỹ thuật, mảng trong Python khác với cả hai khái niệm trên. Trong bài viết này, hãy cùng tìm hiểu xem mảng trong Python là gì và cách triển khai nó nhé!

I. Mảng Trong Python Là Gì

Mảng về cơ bản là 1 cấu trúc dữ liệu có thể chứa nhiều giá trị cùng một lúc. Nó là một tập hợp hoặc một loạt những phần tử (có thứ tự) cùng loại. Ví dụ:

a=arr.array('d',[1.2,1.3,2.3])

Chúng ta có thể chạy vòng lặp qua các mảng một cách dễ dàng và tìm nạp các giá trị cần thiết bằng cách xác định số chỉ mục (index number). Mảng cũng có thể thay đổi, do đó, bạn có thể thực hiện các thao tác khác nhau theo yêu cầu.

Mảng Trong Python Là Gì
Mảng Trong Python Là Gì

II. Khai Báo Mảng Trong Python

Để tạo mảng, các bạn cần nhập mô-đun array. Chẳng hạn:

import array as arr

a = arr.array(‘d’,[1.2, 3.6, 4.6])

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 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 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
Khai Báo Mảng Trong Python
Khai Báo Mảng Trong Python

III. Nhập Mảng Trong Python

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])
Nhập Mảng Trong Python
Nhập Mảng Trong Python

IV. Duyệt Mảng Trong Python

NumPy package chứa vòng lặp numpy.nditer. Là vòng lặp đa chiều hiệu quả bằng cách sử dụng nó có thể lặp lại trên một mảng. Mỗi phần tử của một 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ả :

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ả :

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 5 10 15 20 25 30 35 40 45 50 55

1. 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ả :

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 :

Có thể buộc đối tượng nditer sử dụng một thứ tự cụ thể bằng cách đề cập rõ ràng đến nó.

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ả :

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

2. 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'

for x in np.nditer(a, op_flags = ['readwrite']):
   x[...] = 2*x
print 'Modified array is:'
print a

Kết quả :

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]]

3. Vòng lặp ngoài :

Phương thức khởi tạo lớp nditer có tham số ‘flags’, có thể nhận các giá trị sau:
  1. c_index : index C_order có thể được theo dõi
  2. f_index : index Fortran_order được theo dõi
  3. multi-index : Có thể theo dõi loại index có một index cho mỗi lần lặp lại
  4. external_loop : các giá trị được cung cấp là mảng một chiều có nhiều giá trị thay vì mảng không chiều
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, flags = ['external_loop'], order = 'F'):
   print x,

Kết quả :

Original array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Modified array is:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]

4. Con trỏ Broadcasting :

Nếu hai mảng có thể broadcast, một đối tượng nditer kết hợp có thể lặp lại chúng đồng thời. Giả sử rằng một mảng a có kích thước 3X4 và có một mảng b khác có kích thước 1X4, trình lặp kiểu sau sẽ được sử dụng (mảng b được broadcast với kích thước là a).

Ví dụ :

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 

print 'First array is:' 
print a 
print '\n'  

print 'Second array is:' 
b = np.array([1, 2, 3, 4], dtype = int) 
print b  
print '\n' 

print 'Modified array is:' 
for x,y in np.nditer([a,b]): 
   print "%d:%d" % (x,y),

Kết quả :

First array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

Second array is:
[1 2 3 4]

Modified array is:
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4
Duyệt Mảng Trong Python
Duyệt Mảng Trong Python

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 nối mảng. Bất kỳ hai mảng nào cũng có thể được hợp nhất với ký tự “+”.

Ví dụ:

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("Array c = ",c)

Kết quả:

Array 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ác phần tử của mảng a và b.

Nối Mảng Trong Python
Nối Mảng Trong Python

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 thì trong bài giải 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]
lenth = 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ànhcông
for i in range(0, lenth - 1):
    for j in range(i + 1, lenth):
        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):
 
    lenth = 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ànhcông
    for i in range(0, lenth - 1):
        for j in range(i + 1, lenth):
            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 lên kết quả sẽ như sau:

Sắp Xếp Mảng Trong Python
Sắp Xếp Mảng Trong Python

VII. Đảo Ngược Mảng Trong Python

Hướng dẫn tất 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:

Đả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)
#>> [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)
#>> ['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())
# 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())
#>> None.

# Cách in đúng:
l.reverse()
print(l)
#>> ['a', 'b', 'c']

Đả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(org_list)
print(new_list)
# [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.

Đả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 trong python, 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 ( orginary_list )

Trong đó orginary_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ể:

orginary_list = ['a' , 'b', 'c' , 'd' , 'e']
print(orginary_list)
#>> ['a' , 'b', 'c' , 'd' , 'e']

list_iterator = reversed(orginary_list)
print(list_iterator)
#>> <list_reverseiterator object at 0x14d5e9b41340>

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)
#>> 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)
#>>['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:

orginary_list = ['a' , 'b', 'c' , 'd' , 'e']
new_list = list(reversed(orginary_list))

print(orginary_list)
print(new_list)
#>> ['a', 'b', 'c', 'd', 'e']
#>> ['e', 'd', 'c', 'b', 'a']
Đảo Ngược Mảng Trong Python
Đảo Ngược Mảng Trong Python

VIII. Tính Tổng Trong Mảng Python

Hàm tích hợp sẵn sum() trong Python trả về tổng 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)

# start = 10
numbersSum = sum(numbers, 10)
print(numbersSum)

Chạy chương trình, kết quả trả về là:

4.5
14.5
Tính Tổng Trong Mảng Python
Tính Tổng Trong Mảng Python

IX. Các Thao Tác Với Mảng Trong Python

Thay đổi giá trị của phần tử

Như ta biết, list bản chất là array nên mỗi phần tử sẽ có một chỉ số đánh dấu riêng, vị trí đầu tiên là 0, tiếp theo là 1, 2, 3, 4, … Ví dụ bạn có một List gồm 5 phần tử thì lần lược chỉ số đánh dấu của các phần tử là: 0, 1, 2, 3, 4. Như vậy để thay đổi giá trị của phần tử nào thì ta sẽ dựa vào số chỉ mục đánh dấu này.

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 thì ta sử dụng hàm len.

thislist = ["apple", "banana", "cherry"]
print(len(thislist))

Kết quả:

3

Lặp qua từng phần tử

Để lặp qua từng phần tử thì ta sư dụng vòng lặp for hoặc vòng lặp while, kết hợp với hàm len để đếm tổng số phần tử của List.

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 basic 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

Ta phải sử dụng lênh if để kiểm tra. Như ví dụ dưới đây kiểm tra chuỗi “Apple” có tồn tại trong list không.

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 PHP sử dụng cú pháp $var[] = value để thêm một phần tử vào array thì trong Python phải sử dụng phương thức append của List.

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ử ra khỏi List thì ta sử dụng phương thức remove() được tích hợp sẵn trong List.

thislist = ["apple", "banana", "cherry"]
thislist.remove("banana")
print(thislist)

Chương trình này sẽ xóa phần tử có giá trji là “banana”.

Cách 2: Nếu bạn muốn xóa phần tử có số thứ tự index nào đó thì sử dụng phương thức pop(). Nếu bạn không truyền index vào thì mặc định nó sẽ xóa phần tử cuối cùng.

thislist = ["apple", "banana", "cherry"]
thislist.pop(1)
print(thislist)

Chương trình này sẽ xóa phần tử có index = 1, tức là “banana”.

Cách 3: Sử dụng từ khóa del

thislist = ["apple", "banana", "cherry"]
del thislist[<em>0</em>]
print(thislist)

Từ khóa del còn có thể xóa toàn bộ phần tử như sau.

thislist = ["apple", "banana", "cherry"]
del thislist

Thiết lập List rỗng

Để thiết lập list rỗng thì bạn sử dụng phương thức clear().

thislist = ["apple", "banana", "cherry"]
thislist.clear()
print(thislist)
Các Thao Tác Với Mảng Trong Python
Các Thao Tác Với Mảng Trong Python

Bài viết liên quan

guest
0 Thảo Luận & Hỏi Đáp
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
Hotline: 0984.876.750
Chat Facebook
Gọi điện ngay