You are on page 1of 63

TRƯỜNG ĐẠI HỌC THỦY LỢI

Khoa Công nghệ thông tin


Bộ môn Tin học và KTTT

LẬP TRÌNH PYTHON

Giảng viên: TS. Nguyễn Quỳnh Diệp


Email: diepnq@tlu.edu.vn
Điện thoại: 0904345673

1
Chương 7

CÁC KIỂU DỮ LIỆU TỔNG HỢP


Nội dung

❖List (Danh sách)


❖Tuple (Hàng/bộ)
❖Range (Miền)
Kiểu dữ liệu tuần tự

❖Hai loại đặc trưng cơ bản trong điều khiển


➢Sequential access: truy cập tuần tự
➢Random access: truy cập ngẫu nhiên
❖Tuần tự: khá thông dụng trong cuộc sống, chẳng hạn
như xếp hàng, xử lý dây chuyền, lưu trữ trong băng từ,…

4
Kiểu dữ liệu tuần tự

❖Kiểu dữ liệu tuần tự trong python: những kiểu dữ


liệu chứa bên trong nó các dữ liệu con và thường
được xử lý bằng cách lấy ra từng phần-tử-một
theo thứ tự nào đó (thường là bằng vòng for)
➢Các kiểu dữ liệu chứa bên trong nó các dữ liệu nhỏ hơn
thường được gọi là các container (bộ chứa)
➢Khái niệm “tuần tự” nhấn vào việc xử lý từng phần tử
một, nhưng không nhất thiết đây là cách xử lý duy nhất
❖Có 3 kiểu tuần tự thông dụng là list, tuple và
range
❖Có nhiều kiểu khác như string, bytes, bytearray,…
hoặc các lập trình viên có thể tự tạo kiểu riêng
theo nhu cầu
5
List (danh sách)
Bất biến (immutable) và Khả biến (mutable)

❖Bất biến = không thay đổi, các loại dữ liệu bất biến thông dụng
trong Python: bool, int, float, str, tuple và frozenset
❖Khả biến = có thể thay đổi, các loại dữ liệu khả biến thông
dụng trong Python gồm: list, set, dict
❖Chúng ta vẫn thay đổi giá trị của int, tại sao nói “bất biến”
➢Python không thực sự thay đổi giá trị của int, phần mềm tạo
vùng nhớ chứa giá trị mới và cho biến “trỏ” tới vùng đó
❖Ví dụ để hiểu rõ cơ chế này:
n = 100
print(n, id(n)) # 100 và id của biến n
n = n + 1
print(n, id(n)) # 101 và id của n thay đổi so với
trên

7
Khai báo

❖List = dãy các đối tượng (một loại array đa năng)


❖Các phần tử con trong list không nhất thiết phải cùng kiểu dữ
liệu
❖Khai báo trực tiếp: liệt kê các phần tử con đặt trong cặp
ngoặc vuông ([]), ngăn cách bởi dấu phẩy (,)
[1, 2, 3, 4, 5] # list 5 số nguyên
['a', 'b', 'c', 'd'] # list 4 chuỗi
[[1, 2], [3, 4]] # list 2 list con
[1, 'one', [2, 'two']] # list hỗn hợp
[] # list rỗng
❖Kiểu chuỗi (str) trong python có thể xem như một list đặc
biệt, bên trong gồm toàn các str độ dài 1

8
Khởi tạo list

❖Tạo list bằng constructor (hàm tạo)


l1 = list([1, 2, 3, 4]) # list 4 số nguyên
l2 = list('abc') # list 3 chuỗi con
l3 = list() # list rỗng
❖Tạo list bằng list comprehension (bộ suy diễn
danh sách) một đoạn mã ngắn trả về các phần tử
thuộc list
# list 1000 số nguyên từ 0 đến 999
X = [n for n in range(1000)]
# list gồm 10 list con là các cặp [x, x2]
# với x chạy từ 0 đến 9
Y = [[x, x*x] for x in range(10)]

9
So sánh 2 list: theo thứ tự từ điển
a = [1, 2, 3]
b = [1, 2, 3, 4]
c = [1.5]
d = ['a', 'b', 'c']
print(a > b) # False
print(a == b) # False
print(a < b) # True
print(a + [4] == b) # True
print(c <= b) # False
print(d != a) # True
print(d == list('abc')) # True
print(d >= c) # Lỗi
10
Phép toán, chỉ mục và cắt

❖Giữa list và str có sự tương đồng nhất định


➢List cũng hỗ trợ 3 phép toán: ghép nối (+), nhân bản
(*) và thuộc (in)
➢List sử dụng hệ thống chỉ mục và các phép cắt phần
con tương tự như str
❖Điểm khác biệt: nội dung của list có thể thay đổi
# khởi tạo list ban đầu
l1 = list([1, 2, 3, 4])
# thay đổi giá trị của phần tử cuối cùng
l1[-1] = list('abc')
# in nội dung list: [1, 2, 3, ['a', 'b', 'c']]
print(l1)

11
Chỉ mục, lát cắt, xóa dữ liệu với list

a = list('abcde')
print(a) # ['a', 'b', 'c', 'd', 'e']
a[-1] = [0, 5, 9] # thay đổi phần tử cuối cùng
print(a) # ['a', 'b', 'c', 'd', [0, 5, 9]]
a[1:3] = [1, 2, 3] # thay đổi một đoạn
print(a) # ['a', 1, 2, 3, 'd', [0, 5, 9]]
print(a[2::-1]) # [2, 1, 'a']
a[2::-1] = [0] # lỗi, đoạn ngược không thể thay đổi
del a[2::-1] # xóa đoạn con từ 2 trở về đầu
print(a) # [3, 'd', [0, 5, 9]]
del a # xóa biến a
print(a) # lỗi, a không tồn tại

12
Các phương thức của list

❖Một số phương thức thường hay sử dụng


➢append(x): thêm x vào cuối list
➢extend(x): thêm các phần tử của x vào cuối list
➢insert (p, x): chèn x vào vị trí p trong list
➢pop(p): bỏ phần tử thứ p ra khỏi list (trả về giá trị của
phần tử đó), nếu không chỉ định p thì lấy phần tử cuối
➢count(sub, [start, [end]]): đếm số lần xuất hiện của
sub
➢index(sub[, start[, end]]): tìm vị trí xuất hiện của sub,
phát sinh lỗi ValueError nếu không tìm thấy
➢clear(): xóa trắng list

13
Các phương thức của list

❖Một số phương thức thường hay sử dụng


➢copy(): tạo bản sao của list (tương tự list[:])
➢remove(x): bỏ phần tử đầu tiên trong list có giá trị x,
báo lỗi ValueError nếu không tìm thấy
➢reverse(): đảo ngược các phần tử trong list
➢sort(key=…, reverse=True): sắp xếp các phần tử key
theo thứ tự giảm dần. Mặc định là reverse = False là
sắp xếp tăng dần, bằng cách so sánh trực tiếp giá trị.
x = “Dai hoc Thuy loi”.split()
x.sort(key=str.lower)
print(x)
14
Các phương thức của list

❖Ví dụ:

15
Ví dụ về sắp xếp với list

a = ['123', '13', '90', "-1", -100]


a.sort() # lỗi, vì các phần tử không cùng kiểu
a[-1] = '-100' # thay đổi phần tử cuối thành dạng chuỗi
a.sort() # xếp tăng dần theo so sánh chuỗi
print(a) # ['-1', '-100', '123', '13', '90']
a.sort(key=int) # chuyển thành số nguyên rồi sắp xếp
print(a) # ['-100', '-1', '13', '90', '123']
a.sort(key=int, reverse=True)
print(a) # ['123', '90', '13', '-1', '-100']

16
Duyệt list với vòng lặp for

my_list = ['foo', 'bar', 'baz', 'noo’]

# duyệt các phần tử, cách làm đơn giản nh


ất
for item in my_list:
print(item)

# duyệt các phần tử theo giá trị chỉ mục


for i in range(len(my_list)):
print(i, my_list[i])

17
Ví dụ về làm việc với list

# tạo và in nội dung của một list


danhsach = ["apple", "banana", "cherry"]
for x in danhsach:
print(x)
# thêm một phần tử vào cuối list và lại in ra
danhsach.append("orange")
print(danhsach)
# thêm một phần tử vào giữa list và in ra
danhsach.insert(1, "orange")
print(danhsach)
# sắp xếp lại danh sách và in ra
danhsach.sort()
print(danhsach)
18
Một số thao tác thông dụng với list

➢Tạo một list


➢Duyệt list
➢Truy cập phần tử theo chỉ số
➢Thay đổi nội dung phần tử
➢Cắt list
➢Thêm phần tử vào list
➢Bỏ phần tử khỏi list
➢Tìm kiếm phần tử trong list
➢Sắp xếp các phần tử trong list
➢List hỗn hợp

19
Bài tập

1.
- Nhập 1 số nguyên dương n
- Nhập danh sách gồm n số nguyên a0, a1, …an-1.
- Hãy tính tổng các số nguyên dương lẻ có trong
dãy.
2.
- Nhập 1 số nguyên dương n (n>5)
- Nhập n số nguyên
- Nhập số nguyên dương k (0<k<=n)
- Tính tổng k số hạng liên tiếp mà có tổng lớn nhất.

20
Bài tập 1
Nhập số nguyên dương n và danh sách gồm n số nguyên a0,
a1, …an-1. Hãy tính tổng các số nguyên dương lẻ có trong dãy.

21
Bài tập 2

Nhập số nguyên n (n>5)


Nhập n số nguyên.
Nhập số nguyên k (0<k<=n).
Tính tổng k số hạng liên tiếp
có tổng lớn nhất.

22
Bài tập 2
Nhập số nguyên n (n>5)
Nhập n số nguyên.
Nhập số nguyên k
(0<k<=n).
Tính tổng k số hạng liên
tiếp có tổng lớn nhất.

23
Ma trận – danh sách hai chiều

Trong Python, các phần tử trong danh sách có thể


là một danh sách. Một ma trận hay 1 mảng 2 chiều
được biểu diễn như một danh sách mà mỗi phần tử
của nó là một danh sách biểu diễn các phần tử
trên 1 dòng.
Ví dụ: [[1,2,3], [2,3,4], [3,4,5]]
123
234
345

24
Ma trận – danh sách hai chiều

Các dòng cột của ma trận được đánh chỉ số từ 0.


<danh sách>[chỉ số hàng][chỉ số cột]
Ví dụ: In các phần tử của ma trận

25
Ma trận – danh sách hai chiều

Ví dụ: Viết chương trình nhập vào một ma trận gồm


m hàng và n cột. In ra ma trận được nhập.

26
Ma trận – danh sách hai chiều

Ví dụ: Viết chương trình nhập vào một ma trận gồm m


hàng và n cột (0<=m, n<=5). In ra ma trận được
nhập.

27
Ma trận – danh sách hai chiều
Ví dụ: Viết chương trình nhập vào một ma trận
gồm m hàng và n cột (0<=m, n<=5). In ra ma
trận được nhập.
cin>>x; a[i]=x;
Cin>>a[i]

28
Danh sách của danh sách

29
Bài tập

1. Tạo 1 danh sách n số nguyên bằng cách tạo ngẫu nhiên


trong khoảng từ [0,107]. Hãy thống kê danh sách xem mỗi
phần tử xuất hiện bao nhiêu lần?
2. Cho dãy số a gồm n số nguyên a0,a1,..,an-1. Tìm và đưa ra
dạy con các phần tử liên tiếp, tăng dài nhất trong dãy ban
đầu. (ví dụ: 1 2 5 3 6 7 9 4 3, có dãy con liên tiếp tăng dài
nhất là 3,6,7,9)
3. Tổng các phần tử trên đường chéo chính, tổng các phần từ
trên đường chéo phụ của ma trận n hàng n cột
4. Nhập 1 ma trận mxn. In ra ma trận chuyển vị của ma trận
đó.
5. Nhập ma trận A (mxk) và B(kxn). In ra ma trận C là tích của
hai ma trận A,B.

30
Nhắc lại: tạo danh sách
Cách 1: Kết quả 1, 3:

Cách 2:
Kết quả 2:

Cách 3:
Bài tập

Nhân hai ma trận cấp m x k và k x n?

𝐶𝑚×𝑛 = 𝐴𝑚×𝑘 ∗ 𝐵𝑘×𝑛

32
Chữa bài tập
1. Tạo 1 danh sách n số nguyên bằng cách tạo ngẫu nhiên trong
khoảng từ [0,107]. Hãy thống kê danh sách xem mỗi phần tử xuất
hiện bao nhiêu lần?
Chữa bài tập
2. Dãy con tăng dài nhất: xét dãy số a gồm n số nguyên
a0,a1,..,an-1.
Chữa bài tập

2. Dãy con tăng dài nhất: xét dãy số a gồm n số nguyên a0,a1,..,an-1

35
Bài tập

Tổng đường
chéo chính và
đường chéo
phụ của ma
trận n hàng n
cột.
Phần tử lớn
nhất, nhỏ nhất
của ma trận.

36
Bài tập

Tổng đường
chéo chính và
đường chéo
phụ của ma
trận n hàng n
cột.
Phần tử lớn
nhất, nhỏ nhất
của ma trận.

37
Bài tập

𝐶𝑚×𝑛 = 𝐴𝑚×𝑘 ∗ 𝐵𝑘×𝑛

38
Bài tập

❖Nhập số nguyên dương n (n>5)


❖Nhập dãy số n số nguyên
❖In dãy số theo hàng, mỗi phần tử cách nhau 1
dấu “, ”
❖Tìm min, max
Bài tập

❖Nhập số nguyên dương n


(n>5). Nhập dãy số n số
nguyên. In dãy số theo
hàng, mỗi phần tử cách
nhau 1 dấu “, ”. Tìm min,
max
Bài tập

❖Nhập số nguyên dương n (n>5)


❖Nhập dãy số n số nguyên
❖In dãy số theo hàng, mỗi phần tử cách nhau 1
dấu “, ”
❖Tìm số nguyên tố trong dãy, in trên 1 dòng
Bài tập

Tìm số nguyên tố trong dãy n số nguyên (n>5)


Tuple (Hàng/Bộ)
Tuple là một dạng readonly list

❖Tuple = dãy các đối tượng, nhưng không thể bị


thay đổi giá trị trong quá trình tính toán
❖Như vậy chuỗi str giống tuple nhiều hơn list
❖Khai báo trực tiếp bằng cách liệt kê các phần tử
con đặt trong cặp ngoặc tròn (), ngăn cách bởi
phẩy
(1, 2, 3, 4, 5) # tuple 5 số nguyên
('a', 'b', 'c', 'd') # tuple 4 chuỗi
(1, 'one', [2, 'two']) # tuple hỗ hợp
(1,) # tuple 1 phần tử
() # tuple rỗng

44
Khai báo tuple không nhất thiết phải dùng ()

t0 = 'a', 'b', 'c' # tuple 3 chuỗi


t1 = 1, 2, 3, 4, 5 # tuple 5 số nguyên
t2 = ('a', 'b', 'c') # tuple 3 chuỗi
t3 = (1, 'one', [2, 'two']) # tuple hỗn hợp
t4 = 1, 'one', [2, 'two'] # tuple hỗn hợp
t5 = () # tuple rỗng
t6 = 'a', # tuple một phần tử
t7 = ('a') # KHÔNG phải tuple (là chuỗi)
t8 = ('a',) # tuple một phần tử
t9 = ('a', ) # tuple,không đúngchuẩn python

45
Tuple và list nhiều điểm giống nhau

❖Tuple có thể tạo bằng cách gán trực tiếp hoặc sử


dụng bộ sinh.
❖Tuple hỗ trợ 3 phép toán: +, *, in
❖Tuple cho phép sử dụng chỉ mục và cắt
❖Các phương thức thường dùng của tuple
➢count(v): đếm số lần xuất hiện của v trong tuple
➢index(sub[, start[, end]]): tương tự như str và list
❖Tuple khác list ở điểm nào?
➢Chiếm ít bộ nhớ hơn
➢Nhanh hơn

46
Bộ sinh của tuple chỉ dùng được 1 lần
# t0 viết giống như bộ suy diễn danh sách
t0 = (c for c in 'Hello!')
# tạo t1 từ t0
t1 = tuple(t0)
# tạo t2 từ t0
t2 = tuple(t0)
print(t0) # <generator object <genexpr> at XXXX>
print(t1) # ('H', 'e', 'l', 'l', 'o', '!')
print(t2) # () <~~ như vậy t0 chỉ dùng được một lần

47
Tính bất biến của kiểu tuple
Tuple và str không thay đổi được nội dung
a = (1, 2, [3, 4], 'abc')
print(a[2]) # [3, 4]
a[2].append('xyz') # a[2] trở thành [3,4,'xyz']
print(a) # (1,2,[3,4,'xyz'],'abc')
a[2] = '123' # lỗi, vì không đc thay đổi ndung
a = (1, 2, 3) # ok: thay đổi a thành tuple mới
a += (4, 5) # ok: a thay đổi thành tuple mới
print(a) # (1, 2, 3, 4, 5)
del a # ok: xóa hoàn toàn a

48
Hàm dựng sẵn làm việc với list và tuple

➢Hàm len(X): trả về số lượng phần tử của X


➢Hàm list(X): tạo một list gồm các phần tử con của X
➢Hàm max(X): trả về giá trị lớn nhất trong X
➢Hàm min(X): trả về giá trị nhỏ nhất trong X
➢Hàm index(X): tìm chỉ số xuất hiện X lần đầu
➢Hàm sorted(X): trả về danh sách mới gồm các phần tử của
X đã được sắp xếp
➢Hàm sum(X): trả về tổng các phần tử trong X
➢Hàm all(X): trả về True nếu tất cả các phần tử của X đều
là True hoặc tương đương với True hoặc x rỗng
➢Hàm any(X): trả về True nếu có ít nhất một phần tử của X
là True hoặc tương đương với True
49
Khi nào dùng tuple, list

❖Tuple khác List ở chỗ tuple không cho phép thay


đổi nội dung, còn list thì được phép. Vì vậy tuple
mạnh hơn list ở những điểm sau:
- Tốc độ truy xuất của tuple nhanh hơn list
- Dung lượng chiếm trong bộ nhớ của tuple ít hơn
- Bảo vệ dữ liệu không bị thay đổi
Range (miền)
Range là một tuple đặc biệt

❖Chúng ta đã làm quen với range khi dùng vòng for


➢range(stop): tạo miền từ 0 đến stop-1
➢range(start, stop[, step]): tạo miền từ start đến stop-1,
với bước nhảy là step
▪ Nếu không chỉ định thì step = 1
▪ Nếu step là số âm sẽ tạo miền đếm giảm dần (start >
stop)
❖Vậy range khác gì một tuple đặc biệt
➢Range chỉ chứa số nguyên
➢Range nhanh hơn rất nhiều
➢Range chiếm ít bộ nhớ hơn
➢Range vẫn hỗ trợ chỉ mục và cắt (nhưng khá đặc biệt)
➢Không nên coi Range là một Tuple!!!
52
Bài tập
Bài tập

1. Nhập từ bàn phím liên tiếp các từ tiếng Anh viết tách
nhau bởi dấu cách. Tách thành các từ sau đó in ra
màn hình các từ đó theo thứ tự từ điển.
2. Nhập từ bàn phím chuỗi các số nhị phân viết liên tiếp
được nối nhau bởi dấu phẩy. Hãy in ra những giá trị
được nhập, mỗi số trên 1 dòng.
3. Nhập số n, in ra màn hình các số nguyên dương nhỏ
hơn n mà có tổng các ước số của nó lớn hơn chính nó.
4. Nhập n, in n dòng đầu tiên của tam giác pascal
1
1 1
1. 2 1 (2,1)= (1,0) + (1,1); (2,2)=(1,1)+(1,2
1. 3. 3. 1. (n,k)=(n-1,k-1) + (n-1,k) 54
Bài tập

5. Tạo tuple P gồm các số nguyên tố nhỏ hơn 100


Nhắc lại: Số nguyên tố là số tự nhiên có 2 ước số là 1 và chính nó.
6.*Hãy nhập số nguyên n, tạo một list gồm các số fibonacci
nhỏ hơn n và in ra
Nhắc lại: Dãy fibonacci là dãy số nguyên được định nghĩa một cách
đệ quy như sau: f(0)=0, f(1) = 1, f(1<n) = f(n-1) + f(n-2)
7.*Liệt kê các chuỗi độ dài ít hơn N của tuple X gồm các chuỗi
được định nghĩa như sau:
➢Chuỗi M = ‘()’ thuộc X
➢Nếu chuỗi A thuộc X thì chuỗi (A) cũng thuộc X
➢Nếu chuỗi A và B thuộc X thì chuỗi AB cũng thuộc X

➢VD: X=(1,5,1,2,a) {1,2,5,a} N=3


➢1, 2, 5, a
➢(1), (2), (5),…
➢(),12, 15, 1a, 25, 2a, 5a… 55
Chữa bài tập

1. Nhập từ bàn phím liên tiếp các từ tiếng Anh viết


tách nhau bởi dấu cách. Tách thành các từ sau đó
in ra màn hình các từ đó theo thứ tự từ điển.
Chữa bài tập

2. Nhập từ bàn phím chuỗi các số nhị phân viết liên


tiếp được nối nhau bởi dấu phẩy. Hãy in ra những
giá trị được nhập, mỗi số trên 1 dòng.
Chữa bài tập

3. Nhập số n, in ra màn hình các số nguyên dương


nhỏ hơn n mà có tổng các ước số của nó lớn hơn
chính nó.
Chữa bài tập

4. Nhập n, in n dòng đầu tiên của tam giác pascal


Chữa bài tập

5. Tạo tuple P gồm các số nguyên tố nhỏ hơn 100


Nhắc lại: Số nguyên tố là số tự nhiên có 2 ước số là 1 và chính nó.
Chữa bài tập

6. *Hãy nhập số nguyên n, tạo một list gồm các số fibonacci


nhỏ hơn n và in ra
Nhắc lại: Dãy fibonacci là dãy số nguyên được định nghĩa một cách
đệ quy như sau: f(0)=0, f(1) = 1, f(1<n) = f(n-1) + f(n-2)
Tóm tắt nội dung bài

❖Ngoài kiểu chuỗi (str), Python có những kiểu dữ liệu tuần


tự khác: danh sách (list), hàng (tuple), miền (range)
❖Danh sách là kiểu tuần tự mạnh mẽ và uyển chuyển:
➢Có thể chứa bên trong nó tất cả các loại dữ liệu
➢Nhiều cách khởi tạo:
▪ Khai báo trực tiếp trong cặp ngoặc vuông
▪ Khởi tạo bằng hàm list
▪ Khởi tạo bằng một đoạn for ngắn (bộ suy diễn danh sách)
➢Duyệt các phần tử con bằng vòng lặp hoặc truy cập qua chỉ số
➢Hỗ trợ các phép toán: ghép nối (+), nhân bản (*), kiểm tra (in)
➢Hai danh sách có thể so sánh với nhau theo thứ tự từ điển
➢Phép cắt lát cho phép lấy phần con của danh sách dễ dàng
➢Rất nhiều phương thức hỗ trợ khác

62
Tóm tắt nội dung bài

❖Hàng cũng là một dãy các dữ liệu như danh sách, nhưng
không thể thay đổi sau khi khởi tạo
➢Cũng có 3 cách khởi tạo:
▪ Khai báo trực tiếp trong cặp ngoặc tròn
▪ Khởi tạo bằng hàm tuple
▪ Khởi tạo bằng hàm sinh (một loại bộ suy diễn dành cho kiểu
hàng)
➢Cũng duyệt phần tử con bằng for hoặc truy cập qua chỉ mục
➢Cũng hỗ trợ các phép toán +, *, in và cắt lát
➢Các phương thức hỗ trợ chỉ có đếm (count) và tìm kiếm (index)
➢Hàng nhanh hơn danh sách, vì hàng “tĩnh” hơn
❖Miền là kiểu dữ liệu thiết kế đặc biệt cho vòng for theo chỉ
số, nhưng cũng có một vài đặc trưng của kiểu dữ liệu tuần
tự như kiểm tra, chỉ mục, cắt lát,...

63

You might also like