Python là một ngôn ngữ lập trình mạnh mẽ và thân thiện, nhưng đôi khi những tính năng tuyệt vời nhất lại bị chúng ta bỏ qua vì không biết đến. Danh sách (list) là một trong những cấu trúc dữ liệu phổ biến nhất trong Python, và dù bạn là người mới bắt đầu hay đã có kinh nghiệm, chắc chắn sẽ có những mẹo nhỏ giúp bạn tối ưu hóa cách làm việc với chúng. Dưới đây là 12 điều về danh sách Python mà bạn sẽ ước mình biết sớm hơn — những kỹ thuật đơn giản nhưng hiệu quả để nâng cấp kỹ năng lập trình của bạn.
1) Chúng ta có thể dùng * để gộp các danh sách lại với nhau
Cụ thể, khi đặt dấu * trước một danh sách, nó sẽ "bung" toàn bộ phần tử trong danh sách đó ra và chèn vào danh sách khác.
Chúng ta có thể kết hợp điều này với các phần tử riêng lẻ và tùy chọn danh sách nào sẽ mở rộng, danh sách nào không.
2) Chúng ta có thể dùng dấu * để mở gói (unpack) danh sách
Giả sử chúng ta có một danh sách chứa thông tin về một chú chó — phần tử đầu tiên là tên, phần tử thứ hai là tuổi, và các phần tử còn lại là các món ăn yêu thích của nó.
Chúng ta có thể dùng dấu * để mở gói một phần của danh sách vào một biến.
Ví dụ: nếu muốn lấy riêng tên và tuổi, còn các món ăn yêu thích được gộp lại thành một danh sách, ta có thể làm như sau.
Ở đây, rocky và 5 được gán lần lượt cho name và age vì chúng là hai phần tử đầu tiên của danh sách.
Trong khi đó, *fav_food được gán cho tất cả các phần tử còn lại, gom chúng thành một danh sách.
3) Sử dụng * để mở gói danh sách làm tham số cho hàm
Giả sử chúng ta có một hàm đơn giản nhận ba tham số (a, b, c) và in ra chúng.
Nếu chúng ta có một danh sách chứa 3 phần tử, có thể truyền danh sách này vào hàm bằng cách sử dụng toán tử * để mở gói nó.
Toán tử * sẽ mở gói các phần tử trong danh sách và truyền chúng dưới dạng các tham số riêng lẻ vào hàm.
Ở đây, với numbers = [1, 2, 3], khi gọi test(*numbers) thì kết quả tương đương với test(1, 2, 3).
Lưu ý rằng trong trường hợp này, hàm test(a, b, c) yêu cầu chính xác 3 tham số, vì vậy danh sách đầu vào của chúng ta cũng phải chứa chính xác 3 phần tử.
4) Sử dụng zip() để duyệt đồng thời 2 danh sách
Hàm dựng sẵn zip() cho phép chúng ta duyệt qua 1 hoặc nhiều danh sách cùng một lúc.
Chúng ta thậm chí có thể duyệt qua 3 hoặc nhiều danh sách cùng lúc nếu muốn:
5) Sử dụng enumerate() để lấy cả chỉ số và giá trị khi duyệt danh sách
Nếu muốn vừa lấy chỉ số (index) vừa lấy giá trị của từng phần tử trong danh sách khi duyệt, chúng ta có thể sử dụng hàm dựng sẵn enumerate().
6) .sort() và sorted()
Cả .sort() và sorted() đều được dùng để sắp xếp danh sách, nhưng chúng có một điểm khác biệt quan trọng:
- .sort():
-
Không trả về giá trị (returns None).
-
Thực hiện sắp xếp trực tiếp trên danh sách gốc, nghĩa là danh sách ban đầu sẽ bị thay đổi.
- sorted():
-
Tạo và trả về một bản sao đã được sắp xếp của danh sách.
-
Danh sách gốc không bị thay đổi, điều này hữu ích nếu bạn muốn giữ nguyên thứ tự ban đầu vì lý do nào đó.
7) .sort() với điều kiện tùy chỉnh
Cả .sort() và sorted() đều hỗ trợ điều kiện tùy chỉnh, nhưng ở đây chúng ta sẽ dùng .sort() làm ví dụ.
Mặc định, .sort() sắp xếp các số theo thứ tự tăng dần.
Nếu muốn sắp xếp theo một điều kiện tùy chỉnh, chúng ta có thể truyền một hàm tùy chỉnh vào tham số key.
Ví dụ: Nếu muốn sắp xếp danh sách theo chữ số cuối cùng, ta có thể làm như sau để nhận được kết quả [22, 38, 19]:
Chúng ta có thể rút gọn điều này bằng cách sử dụng hàm lambda tương đương nếu muốn.
8) List Comprehension
Giả sử chúng ta có một danh sách các loại trái cây và muốn chuyển tất cả chúng thành chữ in hoa. Bạn có thể thực hiện như sau:
Tuy nhiên, chúng ta có thể sử dụng list comprehension để thực hiện việc này một cách gọn gàng hơn chỉ với một dòng mã. Ở đây, phép biến đổi .upper() được áp dụng ngay trong list comprehension.
Chúng ta có thể thêm một câu lệnh điều kiện để lọc ra những trái cây mà chúng ta muốn giữ lại. Ví dụ, chúng ta chỉ giữ lại những trái cây có độ dài từ 5 ký tự trở lên:
9) Tuples vs Lists
Tuples thực chất là những danh sách không thể thay đổi (immutable). Điều này có nghĩa là chúng ta không thể thay đổi (thêm/xóa phần tử) trong tuple sau khi đã tạo ra nó.
Chúng ta định nghĩa một tuple bằng dấu ngoặc tròn thay vì dấu ngoặc vuông:
Nhược điểm khi sử dụng tuple thay vì list:
-
Vì tuple là bất biến (immutable), bạn không thể thêm phần tử mới vào tuple.
-
Vì tuple là bất biến, bạn không thể xóa phần tử khỏi tuple.
Ưu điểm khi sử dụng tuple thay vì list:
-
Tuple là bất biến, điều này có nghĩa là chúng có thể hashable.
-
Tuple có thể làm key trong từ điển (vì list không thể làm key).
-
Tuple có thể được thêm vào set (trong khi list thì không).
10) Phương thức .insert(index, element)
Chắc hẳn bạn đã quen thuộc với phương thức .append() của list, phương thức này chỉ đơn giản là thêm một phần tử mới vào cuối danh sách.
Tuy nhiên, bạn có biết rằng chúng ta cũng có thể sử dụng phương thức .insert()? Phương thức này cho phép bạn thêm phần tử mới vào bất kỳ vị trí nào trong danh sách.
Ví dụ, nếu bạn chèn 'AAA' vào vị trí chỉ số 0, thì 'AAA' sẽ được thêm vào đầu danh sách, và tất cả các phần tử còn lại sẽ bị đẩy lùi ra sau 1 vị trí.
Chèn 'AAA' vào vị trí chỉ số 1 — 'AAA' sẽ được thêm vào chỉ số 1 trong danh sách, và tất cả các phần tử còn lại sẽ được đẩy lùi ra sau 1 vị trí.
Lưu ý — tất cả các phần tử sau chỉ số mà chúng ta chèn sẽ bị đẩy lùi ra sau 1 vị trí, có nghĩa là thao tác này mất O(n) thời gian, hay còn gọi là độ phức tạp thời gian tuyến tính. Điều này có nghĩa là thao tác này có thể chậm nếu danh sách của bạn có quá nhiều phần tử.
11) Phương thức .extend(other_list)
Chúng ta có thể sử dụng phương thức .extend() để thêm tất cả các phần tử từ một list vào cuối một list khác.
Ví dụ, trong a.extend(b), chúng ta sẽ thêm tất cả các phần tử từ b vào a, và b sẽ không bị thay đổi.
Kỹ thuật này, bạn có thể dùng a = a + b, nhưng cách này sẽ tạo ra một danh sách mới và gán lại cho a, làm cho phương pháp này tốn thêm bộ nhớ.
12) list[start:end] = [1, 2, 3]
Bạn chắc đã biết cách thay thế một phần tử trong danh sách bằng list[index] = new_element.
Tuy nhiên, bạn có biết là bạn cũng có thể thay thế một dãy phần tử trong danh sách bằng cách này không?
Ở đây, ls[0:3] có nghĩa là ['apple', 'boy', 'cat'].
ls[0:3] = [1, 2, 3] có nghĩa là Python sẽ thay thế ['apple', 'boy', 'cat'] bằng [1, 2, 3].
Lưu ý — độ dài của dãy thay thế không cần phải giống nhau. Bạn có thể thay thế một dãy dài 3 phần tử bằng chỉ 1 phần tử, giống như ví dụ dưới đây:
Lời kết
Hiểu và tận dụng tối đa các tính năng của danh sách trong Python không chỉ giúp bạn viết code ngắn gọn, hiệu quả hơn mà còn tiết kiệm thời gian khi xử lý dữ liệu. Hy vọng với 12 mẹo này, bạn đã bỏ túi thêm nhiều kiến thức hữu ích để cải thiện cách làm việc với Python. Nếu bạn có những mẹo hay khác, đừng ngần ngại chia sẻ cùng mọi người nhé!
TẠO TÀI KHOẢN MỚI: XEM FULL “1 TÁCH CODEFEE” - NHẬN SLOT TƯ VẤN CV TỪ CHUYÊN GIA - CƠ HỘI RINH VỀ VOUCHER 200K