images
08/12/2020 07:05 am

Các Tips hay trong Python - Phần 2

Trong Python, có rất nhiều cách khác nhau để giải quyết bài toán đặt ra, nhưng cũng rất dễ làm sai hoặc chúng ta đi làm lại những gì mà nhiều thư viện chuẩn đã viết sẵn.

Dưới đây tiếp tục là một số gợi ý giúp cho bạn có thêm những tips hay trong Python:


Copy một danh sách


Để copy một danh sách, bạn dùng hàm copy


>>> a = [1,2,3,5,1]

>>> a.copy()

 [1,2,3,5,1]

>>> import copy

>>> copy.copy(a)

 [1,2,3,5,1]


Sắp xếp trong Python 


Trong Python bạn có thể dùng hàm list.sort() hoặc sorted(list) để sắp kết quả trong 1 danh sách.


>>> a = [1,2,3,5,1]

>>> sorted(a)

[1, 1, 2, 3, 5]

>>> a.sort()

>>>a

[1, 1, 2, 3, 5]


Ở đây chúng ta lưu ý rằng: sorted() sẽ trả về danh sách mới được sắp xếp, còn a.sort() sẽ sắp xếp lại chính danh sách a.


Để đảo lại chiều sắp xếp, bạn có thể có các cách sau:


>>> a.sort(reverse=True)

>>>a

[5, 3, 2, 1, 1]

>>> a.reverse()

>>> a

[1, 1, 2, 3, 5]

>>> a[::-1]

 [5, 3, 2, 1, 1]

>>>reversed(a)


Lưu ý: reversed trả về 1 iterator và bạn có thể dùng vòng For để duyệt


Hàm lambda


Hàm dạng Lambda được sử dụng trong rất nhiều các ngôn ngữ lập trình khác nhau.  Theo định nghĩa của wiki:


In computer programming, an anonymous function (function literal, lambda abstraction, or lambda expression) is a function definition that is not bound to an identifier


Đây được coi là dạng hàm ‘nặc danh’, không định nghĩa tên. Các hàm dạng này thường gặp rất nhiều khi chúng ta lập trình một hàm trong hàm khác, một callback để có thể truyền qua lại giữa các function.


Cú pháp hàm Lambda trong Python:


lambda arguments : expression


Trong đó arguments là các tham số đầu vào và expression là câu lệnh trả về kết quả.


Ví dụ:


>>> sum = lambda a,b: a + b

>>> sum(1,2)

3


Lambda được sử dụng trong các hàm khác như sau: Ví dụ: tính tổng của 1 số với 1  cho trước:


def sum(a):

  return lambda b: a + b


Khi đó giả sử ta có nhu cầu tính tổng các số với 10, ta có thể làm như sau:


>>> sum_with_10 = sum(10)

>>> sum_with_10(35)

45


Trường hợp này: sum_with_10 là một hàm lambda, cho phép tính tổng của 1 số bất kì với 10


>>> sum_with_10

<function sum.<locals>.<lambda> at 0x7f929f2f0d90>


Tương tự, ta có thể tạo ra một hàm khác:


>>> sum_with_100 = sum(100)

>>> sum_with_100(41)

141


Hàm lambda sử dụng để sắp xếp


Hàm list.sort() và sorted() đều chấp nhận một lambda function để xác định giá trị mong muốn sắp xếp. Ví dụ: nếu ta dùng list.sort() hoặc sorted() sẽ báo lỗi:


>>> list = [{"name":"Minh Anh", "score":9.5},{"name":"Huong Giang", "score":7.5},{"name":"Tuan Linh", "score": 8}]

>>>list.sort()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: '<' not supported between instances of 'dict' and 'dict'


Tuy nhiên ta sẽ dùng sort với lambda để sắp danh sách theo tên như sau:


>>> list = [{"name":"Minh Anh", "score":9.5},{"name":"Huong Giang", "score":7.5},{"name":"Tuan Linh", "score": 8}]

>>> list.sort(key=lambda x: x["name"])

>>> list

[{'name': 'Huong Giang', 'score': 7.5}, {'name': 'Minh Anh', 'score': 9.5}, {'name': 'Tuan Linh', 'score': 8}]


Hoặc:


>>> list = [{"name":"Minh Anh", "score":9.5},{"name":"Huong Giang", "score":7.5},{"name":"Tuan Linh", "score": 8}]

>>> sorted(list, key=lambda x: x["name"])

[{'name': 'Huong Giang', 'score': 7.5}, {'name': 'Minh Anh', 'score': 9.5}, {'name': 'Tuan Linh', 'score': 8}]


Sắp xếp với tuple:


>>> list = [("Hoang Anh",9.5),("Huong Giang",7.5),("Tuan Linh",8.5)]

>>> sorted(list, key=lambda a: a[0])

[('Hoang Anh', 9.5), ('Huong Giang', 7.5), ('Tuan Linh', 8.5)]


Sử dụng heapq


Ngoài ra bạn có thể tìm kiếm mảng các đối tượng theo tiêu chí nào đó. Ví dụ tìm ra 3 hãng xe có giá cao nhất như sau:


cars = [{"name":"BMW", "price": 300000},

       {"name": "FORD", "price": 5100000},

       {"name": "TOY", "price": 4400000},

       {"name": "MEC", "price": 2800000}]

print(heapq.nlargest(1, cars, key=lambda car : car['price']))


Ở đây ta dùng thêm hàm lambda để chọn ra key cần so sánh trong đối tượng car.


Tìm phần tử lớn nhất và nhỏ nhất trong danh sách:


import heapq

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

heapq.nlargest(1, nums) // [8]

heapq.nsmallest(1, nums) // [1]


Hàm nlargest(M,list) lấy M là số phần tử lớn nhất mong muốn và list là danh sách truyền vào. Trường hợp trên ta lấy M = 1 tương ứng với tìm 1 phần tử.


Sử dụng min,max với zip


Tìm min, max trong dictionary. Giả sử bạn có dictionary sau:


stocks = {

   "VNM": 50,

   "HCM": 25,

   "FPT": 47,

   "ACB": 18,

   "VCB": 73,

}

print(min(zip(stocks.values(), stocks.keys())))  //  (18, 'ACB')


Nếu ta muốn tìm mã chứng khoán có giá lớn nhất hoặc nhỏ nhất, ta có thể dùng hàm min(zip()) như trên. Các bạn hãy thử với hàm max(zip())


Sử dụng sắp xếp với zip


Vẫn là dữ liệu stocks ở trên, bạn hãy sắp xếp lại danh sách theo các stock có giá tăng dần hay giảm dần:


stocks = {

   "VNM": 50,

   "HCM": 25,

   "FPT": 47,

   "ACB": 18,

   "VCB": 73,

}

print(sorted(zip(stocks.values(), stocks.keys())))

// [(18, 'ACB'), (25, 'HCM'), (47, 'FPT'), (50, 'VNM'), (73, 'VCB')]


Tìm điểm chung giữa 2 Dictionaries


Cho 2 dictionaries sau:


a = { "x": 1, "y": 2, "z": 3}

b = { "x": 1, "b": 2, "a": 3}

print(a.keys() & b.keys())


Kết quả trả ra là 1 tập hợp các key chung, trường hợp này là: {‘x'}


Nếu bạn muốn tìm ra properties chung của 2 Dictionaries, hãy dùng .items() như sau:


a = { "x": 1, "y": 2, "z": 3}

b = { "x": 1, "b": 2, "a": 3}

print(a.items() & b.items())

// {('x', 1)}

Nếu bạn muốn tìm ra key có trong a mà không có trong b, hãy dùng dấu -


a = { "x": 1, "y": 2, "z": 3}

b = { "x": 1, "b": 2, "a": 3}

print(a.keys() - b.keys())

// {'y', 'z'}


Tìm chuỗi ký tự xuất hiện nhiều nhất


Ta dùng thư viện Counter trong collections để tìm ra các phần tử xuất hiện nhiều nhất trong xâu:


from collections import Counter


list = ["python", "java", "golang","javascript", "ruby", "scala","python", "dart","python", "java", "golang"]

print(Counter(list).most_common(3))


Ta dùng thư viện Counter trong collections để đếm số lần xuất hiện của các xâu:


from collections import Counter


list = ["python", "java", "golang","javascript", "ruby", "scala","python", "dart","python", "java", "golang"]

print(Counter(list))


//Counter({'python': 3, 'java': 2, 'golang': 2, 'javascript': 1, 'ruby': 1, 'scala': 1, 'dart': 1})


Mời các bạn đọc thêm “Các tips hay trong Python - Phần 1”.


- Tech Zone -


Thư giãn chút nào!!!

Bài viết liên quan