Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ

Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ
Lập trình Python

– Mảng là tập hợp các phần tử cùng một kiểu dữ liệu duy nhất như: mảng số nguyên, mảng số thực, mảng xâu,… Nhưng trong Python không có kiểu dữ liệu mảng mà sử dụng kiểu danh sách (list).

– Không giống như mảng, danh sách có thể chứa các phần tử khác kiểu nhau.

– Chỉ số của mảng bắt đầu từ 0 đến số phần tử – 1

2. Thao tác với dữ liệu kiểu list

a. Khởi tạo list

a.1. Dạng liệt kê: = [, ,…,]

Ví dụ:

s1 = “” #Tạo xâu rỗng s1 s2 = “Viet Nam” #Tạo xâu s2 có s2[0] = “V”, s2[1] = “i”, …., s2[7] = “m” #Duyệt qua từng phần tử của xâu: s = “Ha Noi Viet Nam” for i in s: print(i,end=“ “) #Xuất ra màn hình dòng chữ: H a N o i V i e t N a m

Lưu ý:

– Hàm len() trả về số phần tử của mảng  len(a) = 4, len(b) = 0, len(c) = 4

– Phép toán:

+ Nối mảng: +   d = a + c thì mảng d gồm 8 phần tử

+ Nhân bản phần tử:  *   e = a * 3 thì mảng e gồm 12 phần tử

a.2. Dạng mô tả (list comprehension): [ for  in ]

Lưu ý: ở đây có thể là list, range hoặc str

Ví dụ:

#1 a = [2, 3, 5, 7] #Tạo mảng a gồm 4 phần tử và a[0] = 2, a[1] = 3, a[2] = 5, a[3] = 7 b = [x**2 for x in a] #Tạo mảng b gồm 4 phần tử, b[0] = 4, b[1] = 9, b[2] = 25, b[3] = 49 #2 s = “2 3 5 8 10” c = [int(x) for x in s.split()] #Tạo mảng c gồm 5 phần tử, có giá trị là 2, 3, 5, 8, 10 #3 d = [x for x in range(0,11,2)] #Tạo mảng d gồm 6 phần tử, có giá trị lần lượt là 0, 2, 4, 6, 8, 10 #4 s = "12345" e = [int(x) for x in s] #Tạo mảng gồm 5 phần tử, có giá trị lần lượt là 1, 2, 3, 4, 5 #5 s = “2 3 5 8 10” d = list(map(int,s.split())) #Tạo mảng d gồm 5 phần tử, có giá trị là 2, 3, 5, 8, 10

Ngoài ra, ta có phương pháp sinh có điều kiện như sau:

  [ for  in if <điều kiện>]

Ví dụ:

#1 d = [x for x in range(0,11) if x%2==0] #Tạo mảng d gồm 6 phần tử, có giá trị lần lượt là 0, 2, 4, 6, 8, 10 #2 s = ‘Xin chao 123’ a = [int(ch) for ch in s if ord(ch)>=48 and ord(ch)<=57 #Tạo mảng số nguyên a gồm 3 phần tử, các phần tử là các số trong xâu s

b. Nhập dữ liệu từ bàn phím vào list

a.1. Dạng nhập từng phần tử (thường biết trước số phần tử của mảng)

Ví dụ: Nhập dữ liệu vào mảng số nguyên a gồm có n phần tử từ bàn phím

n = int(input(“Mời nhập số phần tử: “)); #Nhập số phần tử của mảng a = [] #Khởi tạo mảng rỗng for i in range(0,n): print(“Phần tử thứ”,i+1,”là:”,end=“ “) #Xuất dòng thông báo temp = int(input()) #Lấy giá trị nhập vào và chuyển sang kiểu số nguyên a.append(temp) #Thêm phần tử vào vị trí cuối cùng của mảng

a.2. Dạng nhập toàn bộ phần tử của mảng (thường chưa biết trước số phần tử của mảng)

Ví dụ: Nhập dữ liệu vào mảng số nguyên a từ bàn phím (các số cách nhau dấu cách)

a = list(map(int,input(“Mời nhập các phần tử của mảng: ”).split()))

c. Một số phương thức của list

HàmÝ nghĩa dụ
appenda.append(<đối tượng>)Bổ sung <đối tượng> vào cuối của một danh sách
cleara.clear()Xóa dữ liệu, đưa danh sách a thành rỗng
copya.copy()Trả về một danh sách có giá trị giống a (một bản sao của a)
extenda.extend(<đối tượng>)Mở rộng <đối tượng> vào cuối danh sách a
indexa.index()Trả về chỉ số index đầu tiên trong danh sách của
inserta.insert(,<đối tượng>)Chèn <đối tượng> vào danh sách ở trước vị trí index
popa.pop()Xóa và lấy ra phần tử cuối cùng của danh sách a (ngăn xếp)
removea.remove()Xóa đi phần tử đầu tiên có giá trị bằng
reversea.reverse()Trả lại danh sách có các phần tử ngược với phần tử a
sorta.sort([reverse=True/False])Sắp xếp lại danh sách a theo thứ tự tăng dần giá trị của các phần tử
Một số phương thức của list

3. Tìm hiểu kiểu dữ liệu list of list

– Mảng nhiều chiều là mảng mà mỗi phần tử của nó có kiểu mảng

– Cách tham chiếu đến từng phần tử của mảng 2 chiều (list of list) như sau:

a[i][j] à Tham chiếu phần tử có chỉ số i và j

  Trong đó i là chỉ số phần tử của mảng a và j là chỉ số phần tử của mảng a[i]

4. Thao tác với dữ liệu kiểu list of list

– Duyệt từng phần tử của list of list:

Ví dụ: Duyệt qua từng phần tử của mảng a gồm n phần tử, mỗi phần tử là mảng gồm m phần tử

for i in range(0,n): for j in range(0,m):

5. Phần bài tập về kiểu dữ liệu danh sách (list)

Câu 1: Viết chương trình nhập vào dãy các số nguyên bất kỳ, xuất ra màn hình tổng của các số trong dãy đó?

Câu 2: Viết chương trình nhập vào dãy các số bất kỳ, tìm số lớn nhất trong dãy số đó và xuất ra màn hình?

Câu 3: Viết chương trình nhập vào mảng gồm n số nguyên dương, hãy xuất ra màn hình tổng của các số lẻ trong mảng đó, với n>2

Câu 4: Viết chương trình nhập vào số nguyên dương n, xuất ra màn hình các số nguyên tố nhỏ hơn n, với n>2

Câu 5: Viết chương trình nhập vào bàn phím số nguyên dương n, xuất ra màn hình dãy số Fibonaxi. Biết rằng dãy Fibonaxi có dạng như sau: F0 = 1, F1 = 1, Fn = Fn-1 + Fn-2 với n>1

Câu 6: Viết chương trình dung phương pháp list comprehension để tạo các list sau:

a) Dãy các số là bội của 3 và nhỏ hơn 100

b) Dãy 10 số chính phương đầu tiên

Câu 7: Viết chương trình nhập vào dãy các số nguyên bất kỳ, kiểm tra và xuất ra màn hình xem dãy số đó có tạo thành cấp số cộng hay không?

Bài 8: Viết chương trình nhập vào danh sách gồm n người, mỗi người sẽ có các thông tin như: họ và tên, tuổi, giới tính và quê quán. Sau đó xuất ra màn hình thông tin của từng người đã nhập.

Câu 9: Viết chương trình nhập vào 2 ma trận vuông 5×5 và xuất ra màn hình ma trận tổng của hai ma trận đã nhập?

Xem tiếp Bài 7 – Kiểu dữ liệu từ điển (dict) trong ngôn ngữ lập trình Python

Mảng là một tập hợp có thứ tự gồm một số cố định các phần tử. Không có phép bổ sung phần tử hoặc loại bỏ phần tử được thực hiện.

Các phép toán thao tác trên mảng bao gồm : phép tạo lập (create) mảng, phép tìm kiếm (retrieve) một phần tử của mảng, phép lưu trữ (store) một phần tử của mảng.

Các phần tử của mảng được đặc trưng bởi chỉ số (index) thể hiện thứ tự của các phần tử đó trong mảng.

Mảng bao gồm các loại:

+ Mảng một chiều: Mảng mà mỗi phần tử ai của nó ứng với một chỉ số i.

Ví dụ : Véc tơ a[i] trong đó 0 = 1 . . n cho biết véc tơ là mảng một chiều gồm có n phần tử.

Khai báo : kiểu phần tử A[0...n]

A: Tên biến mảng; Kiểu phần tử: Chỉ kiểu của các phần tử mảng (integer, real, . . .)

+ Mảng hai chiều: Là mảng mà mỗi phần tử aij của nó ứng với hai chỉ số i và j

Ví dụ : Ma trận A[i],[j] là mảng 2 chiều có i là chỉ số hàng của ma trận và j là chỉ số cột của ma trận.

i = 0 . . n; j = 0 . . m

n: Số hàng của ma trận; m : số cột của ma trận.

Khai báo : kiểu phần tử A[n][m];

+ Mảng n chiều : Tương tự như­ mảng 2 chiều.

Cấu trúc dữ liệu đơn giản nhất dùng địa chỉ tính được để thực hiện lưu trữ và tìm kiếm phần tử, là mảng một chiều hay véc tơ.

Thông thư­ờng thì một số từ máy sẽ được dành ra để lưu trữ các phần tử của mảng. Cách lưu trữ này được gọi là cách lưu trữ kế tiếp (sequential storage allocation).

Trường hợp một mảng một chiều hay véc tơ có n phần tử của nó có thể lưu trữ được trong một từ máy thì cần phải dành cho nó n từ máy kế tiếp nhau. Do kích thước của véc tơ đã được xác định nên không gian nhớ dành ra cũng được ấn định trước.

Véc tơ A có n phần tử, nếu mỗi phần tử ai (0 ≤ i ≤ n) chiếm c từ máy thì nó sẽ được lưu trữ trong cn từ máy kế tiếp như­ hình vẽ:

Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ

L0 – Địa chỉ của phần tử a0

Địa chỉ của ai được tính bởi công thức:

Loc(ai) = L0 + c * i

trong đó :

L0 được gọi là địa chỉ gốc - đó là địa chỉ từ máy đầu tiên trong miền nhớ kế tiếp dành để lưu trữ véc tơ (gọi là véc tơ lưu trữ).

f(i) = c * i gọi là hàm địa chỉ (address function)

Đối với mảng nhiều chiều việc lưu trữ cũng tương tự như­ vậy nghĩa là vẫn sử dụng một véc tơ lưu trữ kế tiếp như­ trên.

a01 a11 . . . aij . . . anm

Giả sử mỗi phần tử trong ma trận n hàng m cột (mảng nhiều chiều) chiếm một từ máy thì địa chỉ của aij sẽ được tính bởi công thức tổng quát như­ sau:

Loc(aij) = L0 + j * n + i { theo thứ tự ­ưu tiên cột (column major order }

Cũng với ma trận n hàng, m cột cách lưu tr­ữ theo thứ tự ­ưu tiên hàng (row major order) thì công thức tính địa chỉ sẽ là:

Loc(aij) = L0 + i * m + j

+ Trường hợp cận dưới của chỉ số không phải là 1, nghĩa là ứng với aij thì b1 ≤ i ≤ u1, b2 ≤ j ≤ u2 thì ta sẽ có công thức tính địa chỉ như­ sau:

Loc(aij) = L0 + (i - b1) * (u2 - b2 + 1) + (j - b2)

vì mỗi hàng có (u2 - b2 + 1) phần tử.

Ví dụ : Xét mảng ba chiều B có các phần tử bijk với 1 ≤ i ≤ 2;

1 ≤ j ≤ 3; 1 ≤ k ≤ 4; được lưu trữ theo thứ tự ­ưu tiên hàng thì các phần tử của nó sẽ được sắp đặt kế tiếp như­ sau:

b111, b112, b113, b114, b121, b122, b123, b124, b131, b132, b133, b134, b211, b212, b213, b214, b221, b222, b223, b224, b231, b232, b233, b234.

Công thức tính địa chỉ sẽ là :

Loc(aijk) = L0 + (i - 1) *12 + (j - 1) * 4 + (k - 1)

VD Loc(b223) = L0 + 22.

Xét trường hợp tổng quát với mảng A n chiều mà các phần tử là :

A[s1, s2, . . ., sn] trong đó bi ≤ si ≤ ui ( i = 1, 2, . . ., n), ứng với thứ tự ­ưu tiên hàng ta có:

Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ

Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ

đặc biệt pn = 1.

Chú ý :

  1. Khi mảng được lưu trữ kế tiếp thì việc truy nhập vào phần tử của mảng được thực hiện trực tiếp dựa vào địa chỉ tính được nên tốc độ nhanh và đồng đều đối với mọi phần tử.
  2. Mặc dầu có rất nhiều ứng dụng ở đó mảng có thể được sử dụng để thể hiện mối quan hệ về cấu trúc giữa các phần tử dữ liệu, như­ng không phải không có những trường hợp mà mảng cũng lộ rõ những như­ợc điểm của nó.

Ví dụ : Xét bài toán tính đa thức của x,y chẳng hạn cộng hai đa thức sau:

(3x2 - xy + y2 + 2y - x)

+ (x2 + 4xy - y2 +2x)

= (4x2 + 3xy + 2y + x)

Ta biết khi thực hiện cộng 2 đa thức ta phải phân biệt được từng số hạng, phân biệt được các biến, hệ số và số mũ.

Để biểu diễn được một đa thức với 2 biến x,y ta có thể dùng ma trận: hệ số của số hạng xiyj sẽ được lưu trữ ở phần tử có hàng i cột j của ma trận. Nếu ta hạn chế kích thước của ma trận là n × n thì số mũ cao nhất của x,y chỉ xử lý được với đa thức bậc n-1 thôi.

Mỗi phần tử của danh sách có một chỉ số và chỉ số đó bắt đầu từ

Với cách biểu diễn kiểu này thì việc thực hiện phép cộng hai đa thức chỉ là cộng ma trận mà thôi. Như­ng nó có một số hạn chế : số mũ của đa thức bị hạn chế bởi kích thước của ma trận do đó lớp các đa thức được xử lý bị giới hạn trong một phạm vi hẹp. Mặt khác ma trận biểu diễn có nhiều phần tử bằng 0, dẫn đến sự lãng phí bộ nhớ.