Python-List

Python List

List là một tập hợp các giá trị được sắp xếp theo thứ tự. Nó có thể chứa nhiều kiểu dữ liệu khác nhau. List là một container có thể thay đổi. Điều này có nghĩa là chúng ta có thể thêm giá trị, xóa giá trị hoặc sửa đổi các giá trị hiện có.

List trong Python đại diện cho một khái niệm toán học của một chuỗi hữu hạn. Các Giá trị của một list được gọi là các phần tử của list. Một list có thể chứa cùng một giá trị nhiều lần. Mỗi lần xuất hiện được coi là một phần tử riêng biệt.

Simple list

Các phần tử của list có thể được truy cập bằng index của chúng. Phần tử đầu tiên có index 0, phần tử cuối cùng có index -1.
Ví dụ 1: simple list

nums = [1, 2, 3, 4, 5]

print(nums[0])
print(nums[-1])
print(nums)

Đây là một list đơn giản có 5 phần tử. List được phân tách bằng dấu ngoặc vuông []. Các phần tử của list được phân tách bằng ký tự dấu phẩy. Nội dung của danh sách được in ra màn hình console.

nums = [1, 2, 3, 4, 5]

Phía bên phải của toán tử gán = là một list Python. Nó tạo ra một list có năm phần tử.

Kết quả:

1
5
[1, 2, 3, 4, 5]

Ví dụ 2: list có thể bao gồm nhiều kiểu dữ liệu khác nhau

class Being:
    pass

objects = [1, -2, 3.4, None, False, [1, 2], "Python", (2, 3), Being(), {}]
print(objects)

Trong ví dụ, chúng tôi tạo một list các object. Nó chứa các số, một giá trị boolean, một list khác, một string, tuple, bộ giá trị, custom object và dictionary.

Kết quả:

[1, -2, 3.4, None, False, [1, 2], 'Python', (2, 3), <__main__.Being object at 0x000002A00A03C1C8>, {}]

Khởi tạo List

Đôi khi chúng ta cần khởi tạo trước một list để có một số phần tử cụ thể.
Ví dụ 3: khởi tạo list

n1 = [0 for i in range(15)]
n2 = [0] * 15

print(n1)
print(n2)

n1[0:10] = [10] * 10

print(n1)

Trong ví dụ này, chúng ta khởi tạo 2 list bằng cách sử dụng list comprehension [0] và toán tử *

n1 = [0 for i in range(15)]
n2 = [0] * 15

2 list n1, n2 được khởi tạo thành bởi 15 số 0.

n1[0:10] = [10] * 10

Mười giá trị đầu tiên được thay thế bằng 10.

Kết quả:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0]

Function list()

Hàm list() tạo một list từ một iterable object. iterable object có thể là một string, một container support tính lặp lại. Nếu không có tham số nào được chỉ định, một list trống mới sẽ được tạo.
Ví dụ 4: khởi tạo list bằng function list()

a = []
b = list()

print(a == b)

print(list((1, 2, 3)))
print(list("Vncoding"))
print(list(['Ruby', 'Python', 'Perl']))

Trong ví dụ này, chúng ta tạo một list trống, một list từ một tuple, một string và một list khác.

a = []
b = list()

Đây là hai cách để tạo list trống.

print(a == b)

Dòng code này in True chứng tỏ a và b bằng nhau.

print(list((1, 2, 3)))

Tạo list từ tuple

print(list("Vncoding"))

Tạo list từ string

print(list(['Ruby', 'Python', 'Perl']))

Tạo list từ list các string

Kết quả:

True
[1, 2, 3]
['V', 'n', 'c', 'o', 'd', 'i', 'n', 'g']
['Ruby', 'Python', 'Perl']

Toán tử xử lí list

Ví dụ 5: Toán tử xử lí list

n1 = [1, 2, 3, 4, 5]
n2 = [3, 4, 5, 6, 7]

print(n1 == n2)
print(n1 + n2)

print(n1 * 3)

print(2 in n1)
print(2 in n2)

Define 2 list số nguyên và sử dụng một vài toán tử thao tác list.

print(n1 == n2)

Nội dung của list n1, n2 được so sánh bởi toán tử ==. Biểu thức so sánh bằng trả về giá trị False vì n1, n2 khác nhau.

print(n1 + n2)

List mới được tạo thành từ list n1 và n2.

print(n1 * 3)

sử dụng toán tử * để tạo list mới, list được tạo thành từ list n1 được lặp lại 3 lần.

print(2 in n1)

Sử dụng toán tử in để tìm xem giá trị có trong list hay không. Nó trả về giá trị boolean True hoặc False.

Kết quả:

False
[1, 2, 3, 4, 5, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
True
False

Function Sequence

Function sequence có thể được sử dụng cho mọi loại squence, bao gồm cả list
Ví dụ 6:

n = [1, 2, 3, 4, 5, 6, 7, 8]

print("There are {0} items".format(len(n)))
print("Maximum is {0}".format(max(n)))
print("Minimum is {0}".format(min(n)))
print("The sum of values is {0}".format(sum(n)))

Trong ví dụ này, sử dụng function len(), max(), min(), sum() để tính độ dài, tìm giá trị lớn nhất, nhỏ nhất và tính tổng các phần tử trong list.

Kết quả:

There are 8 items
Maximum is 8
Minimum is 1
The sum of values is 36

Insert phần tử vào list

Ví dụ 6: insert phần tử vào list

langs = []

langs.append("Python")
langs.append("Perl")
print(langs)

langs.insert(0, "PHP")
langs.insert(2, "Lua")
print(langs)

langs.extend(("JavaScript", "ActionScript"))
print(langs)

Chúng ta có 3 phương thức để insert phần tử vào list: append, insert, và extend.

langs = []

Tạo list rỗng

langs.append("Python")
langs.append("Perl")

Append 2 string vào list langs

langs.insert(0, "PHP")
langs.insert(2, "Lua")

Insert string “PHP” vào vị trí đầu tiên list langs (index = 0), insert string “Lua” vào vị trí thứ 3 trong list langs.

langs.extend(("JavaScript", "ActionScript"))

Phương thức extend add sequence vào cuối list langs.

Kết quả:

['Python', 'Perl']
['PHP', 'Python', 'Lua', 'Perl']
['PHP', 'Python', 'Lua', 'Perl', 'JavaScript', 'ActionScript']

Exception IndexError

Exception IndexError được thông báo khi access vào index vượt quá kích thước list (out of range)
Ví dụ 7: Access vào index vượt quá kích thước list

n = [1, 2, 3, 4, 5]

try:
    n[0] = 10
    n[6] = 60
    
except IndexError as e:
    print(e)

Define một list gồm 5 số nguyên. Các phần tử này có index 0, 1, 2, 3 và 4. Sử dụng index lớn hơn sẽ dẫn đến lỗi.

n[6] = 60

Index 6 nằm ngoài phạm vi list. Exception IndexError được trình thông dịch trả về.

except IndexError as e:    
    print(e)

Chúng ta sử dụng except để băt exception, nếu exception xảy ra thực hiện in error message bằng lệnh print(e)

Kết quả:

C:\Python\Python37>python.exe test.py
list assignment index out of range

TypeError

Nếu index của tuple không phải là số integer, exception TypeError được thông báo.
Ví dụ 8:

n = [1, 2, 3, 4, 5]

try:
    print(n[1])
    print(n['2'])
    
except TypeError as e:
    
    print("Error in file {0}".format( __file__))
    print("Message: {0}".format(e))

Ví này thông báo exception TypeError

print(n['2'])

index để truy xuất tuple/list phải là số integer. Nếu là giá trị khác, exception được thông báo.

except TypeError as e:
    
    print("Error in file {0}".format( __file__))
    print("Message: {0}".format(e))

Source code xử lí exception TypeError, in ra tên file source python gây ra exception và error message

Kết quả:

C:\Python\Python37>python.exe test.py
2
Error in file test.py
Message: list indices must be integers or slices, not str

Remove phần tử khỏi list

Trong ví dụ trước, chúng ta đã tìm hiểu cách add phần tử vào list, bây giờ chúng ta đi tìm hiểu cách remove phần tử khỏi list
Ví dụ 9: Remove phần tử khỏi list

langs = ["Python", "Ruby", "Perl", "Lua", "JavaScript"]
print(langs)

lang = langs.pop(3)
print("{0} was removed".format(lang))

lang = langs.pop()
print("{0} was removed".format(lang))

print(langs)

langs.remove("Ruby")
print(langs)

Phương thức pop() remove và trả về một phần tử có index được chỉ định hoặc phần tử cuối cùng nếu không chỉ định index trong phương thức pop().
Phương thức remove() remove phần tử khỏi list.

lang = langs.pop(3)
print("{0} was removed".format(lang))

Chúng ta remove phần tử có index 3. Phương thức pop() trả về tên của phần tử bị remove; và in giá trị phần tử bị remove ra màn hình console

lang = langs.pop()
print("{0} was removed".format(lang))

Phần tử cuối cùng trong list là “JavaScript”, phương thức pop() không chỉ định index sẽ remove và trả về giá trị phần tử cuối cùng.

langs.remove("Ruby")

Dòng code này remove string “Ruby” ra khỏi list

Kết quả:

['Python', 'Ruby', 'Perl', 'Lua', 'JavaScript']
Lua was removed
JavaScript was removed
['Python', 'Ruby', 'Perl']
['Python', 'Perl']

Ví dụ 10: Sử dụng keyword del để remove phần tử khỏi list

langs = ["Python", "Ruby", "Perl", "Lua", "JavaScript"]
print(langs)

del langs[1]
print(langs)

#del langs[15]

del langs[:]
print(langs)

Trong ví dụ này, chúng ta define 1 list string và sử dụng keyword del để xóa phần tử trong list

del langs[1]

Remove phần tử thứ 2 “Ruby” khỏi list.

#del langs[15]

Nếu uncomment câu lệnh này, chương trình sẽ báo lỗi, exception do index = 15 vượt quá kích thước của list.

del langs[:]

Remove tất các các phần tử trong list. Toán tử [:] ám chỉ toàn bộ phần tử của list.

Kết quả:

C:\Python\Python37>python.exe test.py
['Python', 'Ruby', 'Perl', 'Lua', 'JavaScript']
['Python', 'Perl', 'Lua', 'JavaScript']
[]

Modify phần tử trong list

langs = ["Python", "Ruby", "Perl"]

langs.pop(2)
langs.insert(2, "PHP")
print(langs)

langs[2] = "Perl"
print(langs)

Trong ví dụ này, chúng ta modify phần tử thứ ba của list langs hai lần.

langs.pop(2)
langs.insert(2, "PHP")

Một cách để modify một phần tử là remove nó và insert một phần tử khác vào cùng một vị trí.

langs[2] = "Perl"

Phương pháp khác đơn giản hơn. Assign một phần tử mới tại một vị trí nhất định. Bây giờ lại có string “Perl” ở vị trí thứ ba.

Kết quả:

['Python', 'Ruby', 'PHP']
['Python', 'Ruby', 'Perl']

Copy list

Ví dụ 11: Copy list

import copy

w = ["Python", "Ruby", "Perl"]

c1 = w[:]
c2 = list(w)
c3 = copy.copy(w)
c4 = copy.deepcopy(w)
c5 = [e for e in w]

c6 = []

for e in w:
    c6.append(e)
    
c7 = []
c7.extend(w)

print(c1, c2, c3, c4, c5, c6, c7)

Trong ví dụ này, chúng ta define 3 list, tạo 7 bản copy list.

import copy

Import module copy. Module copy cung cấp 2 method copy() và deepcopy()

c1 = w[:]

List c1 được copy từ list w bằng toán tử [:]

c2 = list(w)

List c2 được tạo bằng function list(w) với tham số truyền vào là list w

c3 = copy.copy(w)
c4 = copy.deepcopy(w)

Phương thức copy() tạo ra shallow copy list c3, phương thức deepcopy() tạo ra deep copy list c4

c5 = [e for e in w]

List c5 được tạo bằng list comprehension.

c6 = []

for e in w:
    c6.append(e)

List c6 được tạo bởi vòng lặp for và phương thức append()

c7 = []
c7.extend(w)

List c7 được tạo bằng phương thức append()

Kết quả: 7 list được tạo ra bằng các cách khác nhau

C:\Python\Python37>python.exe test.py
['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl'] ['Python', 'Ruby', 'Perl']

Index list

Các phần tử trong list Python có thể được truy cập bằng index của chúng. Index là số nguyên; chúng bắt đầu từ 0. Index có thể âm; index âm tham chiếu đến các phần tử từ cuối list. Phần tử đầu tiên trong list có giá trị 0, phần tử cuối cùng có -1.

Ví dụ 12: Index trong list

n = [1, 2, 3, 4, 5, 6, 7, 8]

print(n[0])
print(n[-1])
print(n[-2])

print(n[3])
print(n[5])

Chúng ta có thể truy cập một phần tử của list bằng index của nó. Index được đặt giữa dấu ngoặc vuông [] sau tên của danh sách.

print(n[0])
print(n[-1])
print(n[-2])

Ba dòng code này in phẩn tử đầu tiên, cuối cùng và phần tử thứ 2 (tính từ phần tử cuối)

print(n[3])
print(n[5])

Hai dòng code này in phần tử thứ 4 và thứ 6 của list.

Kết quả:

C:\Python\Python37>python.exe test.py
1
8
7
4
6

Phương thức index(e, start, end) tìm kiếm một phần tử cụ thể và trả về index thấp nhất của nó. start và end là các tham số tùy chọn giới hạn tìm kiếm trong các ranh giới nhất định.
Ví dụ 13: Phương thức index()

n = [1, 2, 3, 4, 1, 2, 3, 1, 2]

print(n.index(1))
print(n.index(2))

print(n.index(1, 1))
print(n.index(2, 2))

print(n.index(1, 2, 5))
print(n.index(3, 4, 8))

Trong ví dụ này, chúng ta tìm hiểu phương thức index()

print(n.index(1))
print(n.index(2))

2 dòng code này in ra giá trị index của phần tử gần nhất (tính từ trái -> phải) có giá trị 1 và 2 trong list.

print(n.index(1, 1))
print(n.index(2, 2))

Tìm kiếm phần tử có giá trị 1 từ vị trí index = 1 => in ra giá trị index xuất hiện phần tử có giá trị 1 đầu tiên.
Tìm kiếm phần tử có giá trị 2 từ vị trí index = 2 => in ra giá trị index xuất hiện phần tử có giá trị 2 đầu tiên.

print(n.index(1, 2, 5))

Tìm kiếm phần tử có giá trị 1 từ vị trí index trong khoảng (2, 5) => in ra giá trị index xuất hiện phần tử có giá trị 1 đầu tiên.

Kết quả:

C:\Python\Python37>python.exe test.py
0
1
4
5
4
6

slicing lists

Slicing list là một thao tác trích xuất các phần tử nhất định từ một list và format chúng thành một list khác. Có thể với số lượng chỉ số khác nhau và phạm vi index khác nhau.
Cú pháp của slicing list như sau:

[start:end:step]

start, end, step là số nguyên. Mỗi tham số là tùy chọn (không bắt buộc chỉ định). Giá trị các tham số có thể âm hoặc dương. Nếu chỉ định end index => giá trị tại end index không được include trong list.

Ví dụ 14: Slicing list

n = [1, 2, 3, 4, 5, 6, 7, 8]

print(n[1:5])
print(n[:5])
print(n[1:])
print(n[:])

Trong ví dụ này, chúng ta tạo 4 list từ list 8 số nguyên.

print(n[1:5])

List đầu tiên gồm các phần tử từ index 1,2,3,4.
n[1:5] = [2,3,4,5]

print(n[:5])

Nếu bỏ qua start index, giá trị default 0 sẽ được dùng. List n[:5] = [1, 2, 3, 4, 5]

print(n[1:])

Nếu bỏ qua end index, giá trị default -1 sẽ được dùng. List n[1:] = [2, 3, 4, 5, 6, 7, 8]

print(n[:])

n[:] tạo ra bản copy của list n

Kết quả:

C:\Python\Python37>python.exe test.py
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

Ví dụ 15: Slice list với tham số step

n = [1, 2, 9, 4, 5, 6, 7, 8]

print(n[1:9:2])
print(n[::2])
print(n[::1])
print(n[1::3])

Trong ví dụ này, chúng ta tìm hiểu tham số thứ 3 step.

print(n[1:9:2])

Tạo list từ index 1 đến 8 với step = 2.
n[1:9:2] = [2, 4, 6, 8]

print(n[::2])

Tạo list từ index 0 đến 7 với step = 2
n[::2] = n[0:-1:2] = [1, 9, 5, 7]

print(n[::1])

Tạo list từ index 0 đến 7 với step = 1
n[::1] = n[0:-1:1] = [1, 2, 9, 4, 5, 6, 7, 8]

print(n[1::3])

Tạo list từ index 1 đến 7 với step = 3
n[1::3] = n[1:-1:3] = [2, 5, 8]

Kết quả:

C:\Python\Python37>python.exe test.py
[2, 4, 6, 8]
[1, 9, 5, 7]
[1, 2, 9, 4, 5, 6, 7, 8]
[2, 5, 8]

Index có thể là số âm. Index âm sẽ refer giá trị từ cuối list. Phần tử cuối có index = -1, phần tử thứ 2 (tính từ phần tử cuối) có index = -2. Index với số âm nhỏ hơn phải viết trước trong cú pháp.
Ví dụ:
n[-6:-2] trả về list gồm các phần tử thứ 6 đến thứ 2 (tính từ phần tử cuối)
n[-2:-6] trả về empty list

Ví dụ 16: Tạo list với index âm

n = [1, 2, 3, 4, 5, 6, 7, 8]

print(n[-4:-1])
print(n[-1:-4])

print(n[-5:])
print(n[-6:-2:2])
print(n[::-1])

Trong ví dụ này, chúng ta tạo list với index âm

print(n[-4:-1])

n[-4:-1] = [5, 6, 7, 8]

print(n[-1:-4])

n[-1:-4] trả về empty list

print(n[-5:])

n[-5:] = n[-5:-1] = [4, 5, 6, 7, 8]

print(n[-6:-2:2])

n[-6:-2:2] = [3, 5] Vì end index (-2) được chỉ định, phần tử giá trị 7 không được include trong list.

print(n[::-1])

Tạo list đảo ngược.
n[::-1] = n[0:-1:-1] = [8, 7, 6, 5, 4, 3, 2, 1]

Kết quả:

C:\Python\Python37>python.exe test.py
[5, 6, 7]
[]
[4, 5, 6, 7, 8]
[3, 5]
[8, 7, 6, 5, 4, 3, 2, 1]

Ví dụ 17: Sử dụng slice để thay thế giá trị phần tử trong list

n = [1, 2, 3, 4, 5, 6, 7, 8]

n[0] = 10
n[1:3] = 20, 30
n[3::1] = 40, 50, 60, 70, 80

print(n)

Kết quả:

C:\Python\Python37>python.exe test.py
[10, 20, 30, 40, 50, 60, 70, 80]

Duyệt list

Có 3 cách để duyệt các phần tử trong list

Ví dụ 17: dùng vòng lặp for để duyệt list

n = [1, 2, 3, 4, 5]

for e in n:
    print(e, end=" ")
    
print() 

Đây là cách đơn giản nhất để duyệt list

n = [1, 2, 3, 4, 5]

Tạo list n gồm 5 số nguyên

for e in n:
    print(e, end=" ")

Dùng vòng lặp for duyệt list và in từng phần tử của list ra màn hình console.

Kết quả:

C:\Python\Python37>python.exe test.py
1 2 3 4 5

Ví dụ 18: dùng vòng lặp while để duyệt list

n = [1, 2, 3, 4, 5]

i = 0
s = len(n)

while i < s:
    print(n[i], end=" ")
    i = i + 1

print()

Trong ví dụ này, chúng ta sử dụng vòng lặp while để duyệt list

i = 0
s = len(n)

Khai báo biến i đóng vai trò counter.
Tính kích thước list n

while i < s:
    print(n[i], end=" ")
    i = i + 1

Duyệt list theo biến counter i, in giá trị list n[i], tăng counter lên 1.

Kết quả:

C:\Python\Python37>python.exe test.py
1 2 3 4 5

Ví dụ 19: Sử dụng function enumerate() duyệt list

n = [1, 2, 3, 4, 5]

print(list(enumerate(n)))

for e, i in enumerate(n):
    print("n[{0}] = {1}".format(e, i))

Trong ví dụ này, chúng ta in phần tử và index của từng phần tử ra màn hình console

print(list(enumerate(n)))

Hàm enumerate(n) trả về list gồm (phần tử, index) của list n.

Kết quả:

C:\Python\Python37>python.exe test.py
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
n[0] = 1
n[1] = 2
n[2] = 3
n[3] = 4
n[4] = 5

Đếm số phần tử trong list

Ví dụ 20: Đếm số lần xuất hiện của phần tử x trong list

n = [1, 1, 2, 3, 4, 4, 4, 5]

print(n.count(4))
print(n.count(1))
print(n.count(2))
print(n.count(6))
n = [1, 1, 2, 3, 4, 4, 4, 5]

Tạo list các số nguyên

print(n.count(4))
print(n.count(1))
print(n.count(2))
print(n.count(6))

Sử dụng phương thức count() để đếm số lần xuất hiện của 4, 1, 2 và 6 trong list.

Kết quả:

C:\Python\Python37>python.exe test.py
3
2
1
0

Nested list

Trong Python, có thể tạo các nest list nằm trong 1 list khác. Để access vào nest list, chúng ta cần dùng thêm dấu ngoặc vuông []

Ví dụ 21: Tạo nest list

nums = [[1, 2], [3, 4], [5, 6]]

print(nums[0])
print(nums[1])
print(nums[2])

print(nums[0][0])
print(nums[0][1])

print(nums[1][0])
print(nums[2][1])

print(len(nums))

Trong ví dụ này, chúng ta tạo list gồm có 3 nest list, mỗi nest list gồm có 2 phần tử

print(nums[0])
print(nums[1])
print(nums[2])

In 3 nest list ra màn hình console

print(nums[0][0])
print(nums[0][1])

In 2 phần tử của nest list thứ nhất
nums[0] tham chiếu đến nest list thứ nhất, nums[0][0] tham chiếu đến phần tử thứ nhất của nest list thứ nhất, nums[0][1] tham chiếu đến phần tử thứ hai của nest list thứ nhất.

print(len(nums))

Kích thước list nums = 3 vì mỗi nest list được coi như 1 phần tử.

Kết quả:

C:\Python\Python37>python.exe test.py
[1, 2]
[3, 4]
[5, 6]
1
2
3
6
3

Ví dụ 22: Nest list với kích thước khác nhau

nums = [[1, 2, [3, 4, [5, 6]]]]

print(nums[0])
print(nums[0][2])
print(nums[0][2][2])

print(nums[0][0])
print(nums[0][2][1])
print(nums[0][2][2][0])

Trong ví dụ này, list [5, 6] được lồng vào list [3, 4, …], list [3, 4, [4, 6]] được lồng vào list [1, 2, …], và cuối cùng list [1, 2, [3, 4, [5, 6]]] là 1 phần tử của list nums

print(nums[0])
print(nums[0][2])
print(nums[0][2][2])

3 dòng code này in ra 3 nest list [1, 2, [3, 4, [5, 6]]], [3, 4, [5, 6]], [5, 6]

print(nums[0][0])
print(nums[0][2][1])
print(nums[0][2][2][0])

In ra 3 phần tử của nest list

Kết quả:

C:\Python\Python37>python.exe test.py
[1, 2, [3, 4, [5, 6]]]
[3, 4, [5, 6]]
[5, 6]
1
4
5

Sort list

Trong phần này, chúng ta tìm hiểu built-in function sort() và sorted() để sắp xếp các phần tử trong list.

Ví dụ 23: sắp xếp list

n = [3, 4, 7, 1, 2, 8, 9, 5, 6]
print(n)

n.sort()
print(n)

n.sort(reverse=True)
print(n)

Trong ví dụ này, chúng ta define list các số nguyên chưa sắp xếp. Sau đó, sử dụng phương thức sort() để sắp xếp các phần tử trong list

n.sort()

Phương thức sort() sắp xếp các phần tử list theo thứ tự tăng dần

n.sort(reverse=True)

Với tham số reverse = True, phương thức sort() sắp xếp list theo thứ tự giảm dần.

Kết quả:

C:\Python\Python37>python.exe test.py
[3, 4, 7, 1, 2, 8, 9, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

Phương thức sort() thực hiện sắp xếp trực tiếp trên list. Nếu muốn sắp xếp list mà không modify original list, sử dụng phương thức sorted(), hàm sorted() trả về list được sắp xếp. Xem ví dụ sau

Ví dụ 24: Sử dụng hàm sorted() để sắp xếp list

n = [3, 4, 1, 7, 2, 5, 8, 6]

print(n)
print(sorted(n))
print(n)

Kết quả:

C:\Python\Python37>python.exe test.py
[3, 4, 1, 7, 2, 5, 8, 6]
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 4, 1, 7, 2, 5, 8, 6]

Từ kết quả, chúng ta thấy hàm sorted() không modify original list n.

Phương thức sort() có optional parameter key. Tham số này chỉ định hàm sẽ được gọi trước khi thực hiện so sánh. Xem ví dụ sau.

Ví dụ 25: Sử dụng phương thức sort() với tham số key

words = ["big", "Blue", "seven", "glass", 
         "Green", "after", "Anctartica"]

words.sort()
print(words)

words.sort(key=str.lower)
print(words)

Trong ví dụ này, chúng ta tạo ra việc so sánh string phân biệt chữ hoa chữ thường và không phân biệt chữ hoa chữ thường.

words.sort(key=str.lower)

Chỉ định key = str.lower để thực hiện convert string sang kí tự in thường => So sánh các string không phân biệt chữ hoa chữ thường.

Kết quả:

C:\Python\Python37>python.exe test.py
['Anctartica', 'Blue', 'Green', 'after', 'big', 'glass', 'seven']
['after', 'Anctartica', 'big', 'Blue', 'glass', 'Green', 'seven']

Ví dụ 26: Sort Unicode string

import locale
from functools import cmp_to_key

w = [u'zem', u'štebot', u'rum', u'železo', u'prameň', u"sob"]
locale.setlocale(locale.LC_COLLATE, ('sk_SK', 'UTF8'))

w.sort(key=cmp_to_key(locale.strcoll))

for e in w:
    print(e)

Trong ví dụ này, chúng ta khai báo list gồm 6 unicode string. Chúng ta modify locale setting để sắp xếp string theo language option.

import locale
from functools import cmp_to_key

Import module locale và hàm cmp_to_key.

w = [u'zem', u'štebot', u'rum', u'železo', u'prameň', u"sob"]

Đây là list gồm 6 string ngôn ngữ Slovakia.

locale.setlocale(locale.LC_COLLATE, ('sk_SK', 'UTF8'))

Set locale setting cho ngôn ngữ Slovakia.

w.sort(key=cmp_to_key(locale.strcoll))

Chúng ta sort list. Function locale.strcoll so sánh 2 string theo setting LC_COLLATE. Function cmp_to_key biến đổi việc so sánh cũ thành key-function.

for e in w:
    print(e)

In các string ra màn hình console

Kết quả:

C:\Python\Python37>python.exe test.py
prameň
rum
sob
štebot
zem
železo

Reverse list

Chúng ta có để đảo ngược list theo nhiều cách. Đảo ngược các phần tử không nên nhầm lẫn với sort theo thứ tự ngược lại.

Ví dụ 26: Đảo ngược list

a1 = ["bear", "lion", "tiger", "eagle"]
a2 = ["bear", "lion", "tiger", "eagle"]
a3 = ["bear", "lion", "tiger", "eagle"]

a1.reverse()
print(a1)

it = reversed(a2)
r = list()

for e in it:
    r.append(e)
    
print(r)

print(a3[::-1])

Trong ví dụ này, chúng ta define 3 list các string. Chúng ta sẽ đảo ngược 3 list này theo 3 cách khác nhau.

a1.reverse()

Cách thứ nhất sử dụng phương thức reverse().

it = reversed(a2)
r = list()

for e in it:
    r.append(e)

Hàm reversed() trả về reverse iterator. Chúng ta sử dụng iterator trong vòng lặp for để tạo list đảo ngược mới.

print(a3[::-1])

Cách thứ 3 là đảo ngược list sử dụng cú pháp slice, với tham số step = -1

Kết quả:

C:\Python\Python37>python.exe test.py
['eagle', 'tiger', 'lion', 'bear']
['eagle', 'tiger', 'lion', 'bear']
['eagle', 'tiger', 'lion', 'bear']

list comprehensions

list comprehension là 1 cấu trúc cú pháp để tạo ra list mới dựa trên list đã có. Cú pháp lệnh được ảnh hưởng bởi kí hiệu tập hợp toán học. Cú pháp Python được lấy cảm hứng từ ngôn ngữ lập trình Haskell.

L = [expression for variable in sequence [if condition]]

Mã giả ở trên hiển thị cú pháp của list comprehension. List comprehension sẽ tạo ra một list mới. Nó dựa trên một list hiện có. Vòng lặp for đi qua chuỗi. Đối với lần vòng lặp, một biểu thức được đánh giá nếu điều kiện được đáp ứng. Nếu giá trị được tính toán thì nó sẽ được thêm vào danh sách mới. Điều kiện là tùy chọn.

list comprehension cung cấp một cách ngắn gọn hơn để tạo list trong các trường hợp có thể sử dụng map và filter và/ hoặc các vòng lặp lồng nhau.

Ví dụ 27: List comprehension

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

b = [e for e in a if e % 2]
print(b)

Trong ví dụ này, chúng ta define list các số nguyên. Chúng ta tạo list số nguyên mới bằng list comprehension với điều kiện các số không chia hết cho 2

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [e for e in a if e % 2]
[e for e in a if e % 2] là list comprehension. Trong vòng lặp for, phần tử e lấy lần lượt các phần tử trong list a,
sau đó kiểm trả điều kiện e % 2, nếu e là số lẻ, e được append vào list.

Kết quả:

C:\Python\Python37>python.exe test.py
[1, 3, 5, 7, 9]

Ví dụ 28: so sánh việc sử dụng list comprehension với vòng lặp for

lang = "Python"

a = []

for e in lang:
    a.append(ord(e))

b = [ord(e) for e in lang]

print(a)
print(b)

Trong ví dụ này, chúng ta list các mã kí tự ASCII trong string “Python”

a = []

for e in lang:
    a.append(ord(e))

Tạo list sử dụng vòng lặp for

b = [ord(e) for e in lang]

Tạo list sử dụng list comprehension.

Kết quả:

C:\Python\Python37>python.exe test.py
[80, 121, 116, 104, 111, 110]
[80, 121, 116, 104, 111, 110]

Function map() và filter()

Hàm map() và filter() là mass function làm việc với tất cả các phần tử list. map() và filter() là 1 phần của built-in function của ngôn ngữ Python.

NOTE: Nên sử dụng list comprehension thay vì sử dụng map()/filter() nhiều nhất có thể.

Ví dụ 29: Sử dụng map()

def to_upper(s):
    
    return s.upper()

words = ["stone", "cloud", "dream", "sky"]

words2 = list(map(to_upper, words))
print(words2)

Function map() apply 1 function cụ thể cho mọi phần tử trong list

def to_upper(s):

    return s.upper()

Đây là định nghĩa hàm to_upper(s) sẽ được apply cho tất cả phần tử của list. Hàm to_upper(s) gọi đến phương thức upper() để convert string sang chữ in hoa.

words = ["stone", "cloud", "dream", "sky"]
words2 = map(to_upper, words)
print(words2)

Hàm map() apply hàm to_upper() vào mọi phần tử trong list words. List mới được tạo và được lưu vào words2.
In ra màn hình console list words2

Kết quả:

C:\Python\Python37>python.exe test.py
['STONE', 'CLOUD', 'DREAM', 'SKY']

Hàm filter() khởi tạo list mới từ những phần tử của list thỏa mãn điều kiện hàm trả về true. Xem ví dụ dưới đây để hiểu rõ hơn.
Ví dụ 30: Sử dụng filter() để tạo list

def positive(x):
    return x > 0

n = [-2, 0, 1, 2, -3, 4, 4, -1]

print(list(filter(positive, n)))

Trong ví dụ này, chúng ta sử dụng hàm filter() để tạo list mới chỉ có phần tử giá trị dương.

def positive(x):
    return x > 0

Đây là định nghĩa hàm được sử dụng bởi hàm filter(). Hàm positive(x) trả về True hoặc False.

Kết quả:

C:\Python\Python37>python.exe test.py
[1, 2, 4, 4]

Be the first to comment

Leave a Reply