Danh sách (list) trong Python

Khi vào làm một dự án thực tế bạn sẽ phải xử lý rất nhiều vấn đề liên quan đến danh sách (danh sách thông tin của người dùng, danh sách các địa điểm, danh sách các ngôi nhà,…) vì vậy việc nắm được kiểu dữ liệu này trong Python là rất quan trọng. Hôm nay chúng ta sẽ đi tìm hiểu một số điều sau:

  1. List là gì?
  2. Làm thế nào để truy cập vào phần tử của một list?
  3. Thực hiện các thao tác cơ bản như thêm, xóa, sửa các phần tử của một list như thế nào?
  4. List comprehension trong Python.

List là gì?

Trong Python, list là một tập hợp có thứ tự chứa một số lượng hữu hạn các phần tử, các phần tử này có thể có cùng kiểu dữ liệu hoặc không.

Ta dùng ngoặc vuông (square brackets) [] để biểu diễn một list trống (empty list): listA = [].

Đối với list có nhiều hơn 1 phần tử, các phần tử được phân biệt bởi dấu phẩy , (comma), chẳng hạn:

listB = [1, 2.3, 'a']
print(listB)

Output

[1, 2.3, 'a']

Các phần tử của một list có thể có kiểu dữ liệu bất kỳ, thậm chí là một list:

listC = [1, ['a', 'b', 'c'], 'abc']
print(listC)

Một list có một hoặc nhiều phần tử bên trong lại là một list được gọi là một danh sách lồng nhau (nested list), chẳng hạn như listC phía trên và các list bên trong được gọi là các list con (sublist).

Truy cập phần tử của list

Mỗi phần tử trong một list luôn được đánh số (indexed) nên dựa vào một chỉ số (index) cụ thể ta có thể truy cập phần tử của một list:

numbers = [1, 2, 3, 4, 5]
print(numbers[0])
print(numbers[1])

Output

1
2

Cần chú ý rằng ta có thể truy cập phần tử với index âm. Khi index là một số âm thì thứ tự lấy phần tử sẽ bị đảo ngược, tính từ phần tử cuối cùng:

numbers = [1, 2, 3, 4, 5]
print(numbers[-1])
print(numbers[-2])

Output

5
4

Gọi k là một số tự nhiên đại diện cho chiều dài (số phần tử) của một list, khi đó chỉ số lớn nhất mà chúng ta có thể truy cập là k - 1. Nếu truy cập vượt chỉ số này Python sẽ báo lỗi.

numbers = [1,2,3,4,5]
print(numbers[5])

Output

IndexError: list index out of range

Chỉ số nhỏ nhất mà chúng ta có thể truy cập là -k. Nếu truy cập chỉ nhỏ số hơn Python sẽ báo lỗi.

numbers = [1,2,3,4,5]
print(numbers[-6])

Output

IndexError: list index out of range

Việc truy cập phần tử của một nested list cũng được thực hiện tương tự:

listC = [1, ['a', 'b', 'c'], 'abc']
print(listC[1])
print(listC[1][0])
print(listC[1][-1])

Output

['a', 'b', 'c']
a
c

Thay đổi một list

Thêm

append

Python cung cấp phương thức (method) append để ta thêm một phần tử mới vào cuối list:

numbers = [1,2,3,4,5]
numbers.append(6)
print(numbers)

Output

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

insert

Sử dụng phương thức insert(index_of_the_value, the_value) để thêm một giá trị mới vào một ví trí cụ thể trong list:

numbers = [1,2,3,4,5]
numbers.insert(1,6)
print(numbers)

Output

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

extend

Muốn thêm tất cả các phần tử của một list vào cuối một list khác ta sử dụng phương thức extend:

listA = [1,2]
listB = ['a', 'b', 'c']

listA.extend(listB)
print(listA)

listB.extend(listA)
print(listB)

Output

[1, 2, 'a', 'b', 'c']
['a', 'b', 'c', 1, 2, 'a', 'b', 'c']

Toán tử +

Ta cũng có thể dùng toán tử + để nối hai list lại với nhau mà không làm thay đổi các list ban đầu:

listA = [1,2]
listB = ['a', 'b', 'c']

listC = listA + listB
print(listA)
print(listC)

Output

[1, 2]
[1, 2, 'a', 'b', 'c']

Xóa

remove

Phương thức remove(value) sẽ xóa đi phần tử đầu tiên mà nó tìm thấy trong list:

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']
fruits.remove('mango')

print(fruits)

Output

['orange', 'banana', 'mango', 'watermelon']

Trường hợp không tìm thấy phần tử nào để xóa theo yêu cầu Python sẽ trả ra lỗi:

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']
fruits.remove('durian')

print(fruits)

Output

ValueError: list.remove(x): x not in list

pop

Nếu muốn xóa phần tử ở một vị trí cụ thể ta có thể dùng phương thức pop(index_of_element). Ngoài ra, pop sẽ trả ra phần tử mà nó đã xóa:

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']
removedElemnt = fruits.pop(2)

print(removedElemnt)
print(fruits)

Output

banana
['orange', 'mango', 'mango', 'watermelon']

Trường hợp ta không truyền chỉ số cụ thể thì pop sẽ lấy giá trị mặc định là chỉ số của phần tử cuối cùng:

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']
removedElemnt = fruits.pop()

print(removedElemnt)
print(fruits)

Output

watermelon
['orange', 'mango', 'banana', 'mango']

del

Để xóa nhiều phần tử liên tiếp trong một list ta có thể dùng từ khóa del theo cú pháp sau:

del yourlist[i, j + 1]

Trong đó i là index của phần tử đầu tiên bạn muốn xoá và j là index của phần tử cuối cùng mà bạn muốn xoá. Mặc định: j = 1.

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']

del fruits[1]
print(fruits)

del fruits[1:3]
print(fruits)

Output

['orange', 'banana', 'mango', 'watermelon']
['orange', 'watermelon']

Sửa

Thay thế trực tiếp qua index

Mỗi phần tử trong list đều có một vị trí cụ thể, căn cứ vào vị trí này ta có thể thay đổi giá trị của phần tử ban đầu bằng cách gán một giá trị mới vào chính vị trí đó:

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']

fruits[1] = 'durian'
print(fruits)

Output

['orange', 'durian', 'banana', 'mango', 'watermelon']

Thay thế nhiều phần tử liên tiếp

Để thay thế nhiều phần tử liên tiếp trong một list ta có thể dùng cú pháp sau:

yourlist[i, j + 1] = [value_1, value_2, ...]

Trong đó i và j lần lượt là index của phần tử đầu tiên và index của phần tử cuối cùng mà bạn muốn thay thế.

fruits = ['orange', 'mango', 'banana', 'mango', 'watermelon']

fruits[1:4] = ['durian', 'apple', 'pineapple']
print(fruits)

Output

['orange', 'durian', 'apple', 'pineapple', 'watermelon']

List comprehension

Trước khi kết thúc, chúng ta hãy tìm hiểu một chút về List comprehension trong Python.

Thông thường, để tạo một list mới từ một list cho trước, ta sẽ dùng vòng lặp như sau:

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

newNumbers = []
for x in numbers:
    if(x > 2):
        newNumbers.append(x + 1)

print(newNumbers)

Output

[4, 5, 6]

Với List comprehension, Python cho phép ta thực hiện tác vụ trên ngắn gọn hơn rất nhiều, cú pháp để sử dụng:

newlist = [expression for item in iterable if condition == True]

Trong đó expression là cách biểu thị phần tử mà bạn muốn thêm vào newListcondition là điều kiện phần tử phải thỏa mãn để được đưa vào newList:

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

newNumbers = [x + 1 for x in numbers if x > 2]

print(newNumbers)

Output

[4, 5, 6]

Vậy qua bài hôm này chúng ta đã nắm được:

  1. Khái niệm về list trong Python.
  2. Cách để truy cập các phần tử của một list thông thường và một nested list.
  3. Các phương thức, từ khóa quan trọng để thao tác với list.
  4. Cú pháp List comprehension để tạo một list mới từ một list cho trước.

Chúc các bạn học tốt!

Python cơ bản

Python cơ bản

Phần 1: Kiến thức tổng quan

Cú pháp (syntax)

Biến (variables)

Chuỗi ký tự (strings)

Số (numbers) trong Python

Boolean trong Python

Vòng lặp trong Python

Danh sách (list) trong Python

Bộ dữ liệu (tuple) trong Python