5 thủ thuật Python giúp xử lý dữ liệu nhanh và viết code gọn hơn
- Home
- 5 thủ thuật Python giúp xử lý dữ liệu nhanh và viết code gọn hơn
Ở bài trước, chúng ta đã tìm hiểu một số thủ thuật Python cơ bản như enumerate(), Counter, set và cách kiểm tra nhiều giá trị bằng in.
Trong bài viết này, hãy tiếp tục với 5 kỹ thuật rất hữu ích khi làm việc với list, dữ liệu và các vòng lặp trong Python.
Đây đều là những tính năng có sẵn trong Python và có thể giúp code ngắn hơn mà vẫn dễ đọc.
zip() để duyệt nhiều danh sách cùng lúcGiả sử chúng ta có hai danh sách chứa tên và tuổi:
names = ["An", "Bình", "Chi"]
ages = [25, 30, 28]
Nếu không sử dụng zip(), bạn có thể phải làm như sau:
for i in range(len(names)):
print(names[i], ages[i])
Python cung cấp zip() để giải quyết vấn đề này:
for name, age in zip(names, ages):
print(name, age)
Kết quả:
An 25
Bình 30
Chi 28
zip()zip() còn rất tiện khi cần kết hợp hai danh sách thành một dictionary:
names = ["An", "Bình", "Chi"]
ages = [25, 30, 28]
users = dict(zip(names, ages))
print(users)
Kết quả:
{
"An": 25,
"Bình": 30,
"Chi": 28
}
Nếu hai danh sách có độ dài khác nhau, zip() mặc định sẽ dừng khi danh sách ngắn hơn kết thúc.
Ví dụ:
names = ["An", "Bình", "Chi"]
ages = [25, 30]
print(list(zip(names, ages)))
Kết quả:
[("An", 25), ("Bình", 30)]
zip() đặc biệt hữu ích khi xử lý dữ liệu từ CSV, API hoặc các danh sách có cấu trúc tương ứng.
any() để kiểm tra có ít nhất một phần tử thỏa điều kiệnGiả sử cần kiểm tra xem danh sách có chứa số âm hay không.
Cách thông thường:
numbers = [1, 2, -3, 4]
found = False
for number in numbers:
if number < 0:
found = True
break
if found:
print("Có số âm")
Python có thể làm việc này ngắn gọn hơn với any():
numbers = [1, 2, -3, 4]
if any(number < 0 for number in numbers):
print("Có số âm")
any() trả về True nếu ít nhất một phần tử trong iterable có giá trị đúng.
users = [
{"name": "An", "active": False},
{"name": "Bình", "active": False},
{"name": "Chi", "active": True}
]
if any(user["active"] for user in users):
print("Có user đang hoạt động")
Cách viết này rất phù hợp khi chỉ cần biết có tồn tại ít nhất một trường hợp hay không.
all() để kiểm tra tất cả phần tửNgược lại với any(), all() trả về True khi tất cả phần tử đều thỏa điều kiện.
Ví dụ:
numbers = [2, 4, 6, 8]
if all(number % 2 == 0 for number in numbers):
print("Tất cả đều là số chẵn")
Kết quả:
Tất cả đều là số chẵn
Nếu danh sách chứa một số lẻ:
numbers = [2, 4, 5, 8]
if all(number % 2 == 0 for number in numbers):
print("Tất cả đều là số chẵn")
else:
print("Có số lẻ")
Kết quả:
Có số lẻ
users = [
{"name": "An", "age": 25},
{"name": "Bình", "age": 30},
{"name": "Chi", "age": 28}
]
if all(user["age"] >= 18 for user in users):
print("Tất cả user đều đủ tuổi")
all() rất hữu ích khi kiểm tra dữ liệu trước khi thực hiện một thao tác tiếp theo.
List comprehension là một trong những tính năng Python được sử dụng rất phổ biến.
Ví dụ, muốn tạo danh sách bình phương:
numbers = [1, 2, 3, 4, 5]
squares = []
for number in numbers:
squares.append(number ** 2)
print(squares)
Có thể viết ngắn gọn thành:
numbers = [1, 2, 3, 4, 5]
squares = [number ** 2 for number in numbers]
print(squares)
Kết quả:
[1, 4, 9, 16, 25]
Bạn cũng có thể thêm điều kiện vào list comprehension:
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [
number
for number in numbers
if number % 2 == 0
]
print(even_numbers)
Kết quả:
[2, 4, 6]
Ví dụ lấy danh sách email từ dữ liệu user:
users = [
{"name": "An", "email": "an@example.com"},
{"name": "Bình", "email": "binh@example.com"},
{"name": "Chi", "email": "chi@example.com"}
]
emails = [user["email"] for user in users]
print(emails)
Kết quả:
[
"an@example.com",
"binh@example.com",
"chi@example.com"
]
List comprehension đặc biệt hữu ích khi xử lý dữ liệu API, JSON, scraping hoặc Pandas.
Tuy nhiên, không nên biến một list comprehension thành một đoạn code quá phức tạp. Khi logic khó đọc, một vòng for thông thường đôi khi lại là lựa chọn tốt hơn.
* giúp xử lý list linh hoạtPython cho phép lấy nhiều giá trị từ một list bằng unpacking.
Ví dụ:
numbers = [1, 2, 3]
a, b, c = numbers
print(a)
print(b)
print(c)
Kết quả:
1
2
3
Nhưng nếu không biết chính xác có bao nhiêu phần tử thì sao?
Bạn có thể sử dụng *:
numbers = [1, 2, 3, 4, 5]
first, *middle, last = numbers
print(first)
print(middle)
print(last)
Kết quả:
1
[2, 3, 4]
5
Trong trường hợp này:
first nhận phần tử đầu tiên.last nhận phần tử cuối cùng.middle nhận tất cả phần tử ở giữa.Giả sử có URL được tách thành nhiều phần:
parts = [
"api",
"users",
"123",
"posts"
]
first, *path, last = parts
print(first)
print(path)
print(last)
Kết quả:
api
['users', '123']
posts
Dấu * còn có thể được sử dụng để truyền các phần tử của list vào function:
numbers = [10, 20, 30]
print(max(*numbers))
Tương đương:
print(max(10, 20, 30))
Bạn cũng có thể sử dụng unpacking để nối list:
a = [1, 2, 3]
b = [4, 5, 6]
result = [*a, *b]
print(result)
Kết quả:
[1, 2, 3, 4, 5, 6]
Đây là một cách rất linh hoạt để thao tác với dữ liệu trong Python.
Mỗi kỹ thuật phù hợp với một tình huống khác nhau:
| Thủ thuật | Sử dụng khi |
|---|---|
zip() |
Duyệt hoặc kết hợp nhiều danh sách |
any() |
Kiểm tra ít nhất một phần tử |
all() |
Kiểm tra tất cả phần tử |
| List comprehension | Tạo hoặc biến đổi list |
Unpacking * |
Lấy hoặc kết hợp nhiều giá trị |
Ví dụ, khi xử lý dữ liệu API, bạn có thể kết hợp nhiều kỹ thuật:
users = [
{"name": "An", "age": 25, "active": True},
{"name": "Bình", "age": 30, "active": False},
{"name": "Chi", "age": 28, "active": True}
]
names = [user["name"] for user in users]
has_active_user = any(
user["active"]
for user in users
)
all_adults = all(
user["age"] >= 18
for user in users
)
print(names)
print(has_active_user)
print(all_adults)
Kết quả:
['An', 'Bình', 'Chi']
True
True
Chỉ với vài dòng code, chúng ta có thể thực hiện nhiều thao tác xử lý dữ liệu.
Python cung cấp rất nhiều công cụ nhỏ nhưng mạnh để giúp developer viết code hiệu quả hơn.
Trong bài viết này, chúng ta đã tìm hiểu:
zip() để xử lý nhiều danh sách cùng lúc.any() để kiểm tra một điều kiện có xuất hiện hay không.all() để kiểm tra toàn bộ dữ liệu.* để xử lý dữ liệu linh hoạt.Điểm quan trọng là không nên sử dụng các thủ thuật này chỉ để làm code ngắn hơn. Hãy sử dụng chúng khi chúng giúp ý định của code trở nên rõ ràng hơn.
Một đoạn code Python tốt không nhất thiết phải có ít dòng nhất. Quan trọng hơn là developer khác có thể đọc và hiểu nó một cách nhanh chóng.
Ở bài tiếp theo trong series Python Tips & Tricks, chúng ta có thể tiếp tục với các thủ thuật thực tế về dictionary, xử lý chuỗi, JSON, file và API trong Python.