× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Cách lọc từ điển Python - Những thông tin cho newbie

28/12/2022 01:23

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng đúng các bộ lọc trên từ điển Python. Chúng ta sẽ bắt đầu bằng cách xem lại những kiến ​​thức cơ bản về từ điển Python. Sau đó, chúng ta sẽ chuyển sang hàm filter() và cách áp dụng hàm này cho từ điển.

Từ điển Python cực kỳ linh hoạt. Chúng có thể chứa nhiều loại dữ liệu khác nhau và được sử dụng để mô hình hóa nhiều đối tượng và quan hệ trong thế giới thực khác nhau. Do đó, không có gì ngạc nhiên khi chúng tôi muốn thực hiện các thao tác cụ thể (như lọc) trên từ điển Python. Việc lọc từ điển trong Python có thể đặc biệt phức tạp vì chúng có thể được lọc theo khóa, giá trị hoặc cả hai bằng cách sử dụng một số điều kiện tùy ý.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng đúng các bộ lọc trên từ điển Python. Chúng ta sẽ bắt đầu bằng cách xem lại những kiến ​​thức cơ bản về từ điển Python. Sau đó, chúng ta sẽ chuyển sang hàm filter() và cách áp dụng hàm này cho từ điển.

Từ điển Python hoạt động như thế nào?

Từ điển Python hoạt động bằng cách tạo liên kết giữa các cặp khóa và giá trị . Mỗi khóa có một giá trị tương ứng được liên kết với nó. Một từ điển có thể chứa nhiều cặp khóa-giá trị như mong muốn.

Đây là một từ điển đơn giản trong Python:

grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
print(grades['John'])
 
# output:
# 7.8

Từ điển cho phép chúng tôi tạo các liên kết trong mã giống với cách tổ chức dữ liệu trong thế giới thực. Trong ví dụ trên, từ điển điểm chứa các khóa (tên của học sinh) được liên kết với các giá trị (điểm tương ứng của mỗi học sinh). Chúng ta có thể sử dụng một khóa cụ thể, như 'John', để truy cập giá trị tương ứng của nó ( 7.8trong trường hợp này).

Cách lọc bằng Python: Hàm filter()

Chức năng tích hợp sẵn của Python filter()có thể được sử dụng để lọc các loại trình tự và vùng chứa khác nhau, bao gồm cả từ điển Python. Hàm filter()này nhận hai đối số: đối số đầu tiên là chức năng lọc “quyết định'' liệu mỗi phần tử có được lọc hay không. Thứ hai là vùng chứa có các phần tử sẽ được lọc.

Để bộ lọc hoạt động, hàm lọc cần lấy một giá trị làm đối số của nó và trả về Truehoặc False(tùy thuộc vào việc giá trị đó có được lọc hay không). Trong hầu hết các trường hợp, chúng tôi tự viết chức năng lọc. 

Trong ví dụ bên dưới, chúng tôi sử dụng filter()để loại bỏ các giá trị âm khỏi danh sách số. Để làm điều đó, chúng tôi xác định is_not_negativechức năng để phục vụ như chức năng lọc của chúng tôi:

def is_not_negative(number):
    return number >= 0
 
 
numbers = [-11056-50]
 
my_filter = filter(is_not_negative, numbers)
 
print(my_filter)
 
# output:
# <filter at 0x7fe451782520>

Đợi đã, kết quả được lọc của chúng tôi ở đâu? Hóa ra, my_filtervẫn chưa chính xác kết quả được lọc của chúng tôi. filter()là một hàm lười biếng, có nghĩa là nó chỉ tính toán kết quả khi chúng ta yêu cầu Python làm như vậy một cách rõ ràng. Một cách để làm điều đó là chuyển bộ lọc trở lại một chuỗi, chẳng hạn như một danh sách:

def is_not_negative(number):
    return number >= 0
 
 
numbers = [-11056-50]
 
my_filter = filter(is_not_negative, numbers)
result = list(my_filter)
 
print(result)
 
# output:
# [10, 56, 0]

Bộ lọc của chúng tôi hoạt động! Danh resultsách chỉ chứa các số không âm của danh sách ban đầu.

Sử dụng filter() để lọc từ điển trong Python

Chúng ta có thể áp dụng logic cơ bản tương tự để lọc từ điển trong Python. Chỉ có một vài khác biệt so với ví dụ trong phần trước:

  • Thay vì các phần tử trong danh sách, chúng ta cần lặp lại các cặp khóa-giá trị của từ điển. Chúng ta có thể làm điều này bằng cách sử dụng phương pháp từ điển dict.items() .
  • Chức năng lọc của chúng tôi cần được điều chỉnh để xử lý các khóa và/hoặc giá trị của từ điển. Các chi tiết cụ thể phụ thuộc vào chính xác cách chúng tôi muốn thực hiện quá trình lọc của mình.
  • Chúng tôi sử dụng dict()chức năng này thay vì list()truyền bộ lọc trở lại từ điển (vì chúng tôi không xử lý danh sách nữa).

Điều chỉnh theo tất cả những thay đổi này, mã sẽ giống như thế này:

def my_filtering_function(pair):
    pass
 
 
grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
filtered_grades = dict(filter(my_filtering_function, grades.items()))

Chúng tôi sắp hoàn thành – chúng tôi chưa triển khai my_filtering_function, vì vậy từ điển kết quả trong filtered_gradestrống. Hãy thảo luận về một số chiến lược lọc mà chúng ta có thể sử dụng.

Lọc khóa ra khỏi từ điển Python

Một hoạt động phổ biến là lọc một khóa không mong muốn ra khỏi từ điển. Để đạt được điều này trong chức năng lọc của chúng tôi, chúng tôi có thể kiểm tra xem khóa đã cho có được muốn hay không và sau đó trả về Truehoặc Falsetương ứng.

Chúng tôi làm chính xác điều đó trong ví dụ dưới đây:

def my_filtering_function(pair):
    unwanted_key = 'Matt'
    key, value = pair
    if key == unwanted_key:
        return False  # filter pair out of the dictionary
    else:
        return True  # keep pair in the filtered dictionary
 
 
grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
filtered_grades = dict(filter(my_filtering_function, grades.items()))
 
print(filtered_grades)
 
# output:
# {'John': 7.8, 'Mary': 9.0, Michael': 9.5}

Thành công! Chúng tôi đã lọc khóa không mong muốn 'Matt'(và giá trị liên quan của nó) ra khỏi từ điển. Lưu ý rằng chúng tôi đã phải "chia tay" pairthành keyvà valueđể chúng tôi có quyền truy cập vào khóa cho logic lọc.

Lọc nhiều khóa ra khỏi từ điển Python

Từ thời điểm này trở đi, bạn chỉ cần điều chỉnh logic my_filtering_functionđể thay đổi cách thực hiện lọc. Ví dụ: chúng ta có thể sử dụng danh sách các khóa mong muốn hoặc không mong muốn để lọc ra nhiều khóa cùng một lúc:

def my_filtering_function(pair):
    wanted_keys = ['John''Matt']
    key, value = pair
    if key in wanted_keys:
        return True  # keep pair in the filtered dictionary
    else:
        return False  # filter pair out of the dictionary
 
 
grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
filtered_grades = dict(filter(my_filtering_function, grades.items()))
 
print(filtered_grades)
 
# output:
# {'John': 7.8, 'Matt': 8.6}

Trong trường hợp này, chỉ các khóa bên trong wanted_keysdanh sách xuất hiện trong từ điển được lọc.

Lọc từ điển Python theo giá trị

Bạn có để ý rằng chúng ta vẫn chưa sử dụng biến giá trị bên trong hàm lọc không? Nếu muốn lọc một từ điển Python theo giá trị, chúng ta chỉ cần sử dụng biến này tại bất kỳ điểm nào trong logic lọc của mình. Ví dụ:

def my_filtering_function(pair):
    key, value = pair
    if value >= 8.5:
        return True  # keep pair in the filtered dictionary
    else:
        return False  # filter pair out of the dictionary
 
grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
filtered_grades = dict(filter(my_filtering_function, grades.items()))
 
print(filtered_grades)
 
# output:
# {'Mary': 9.0, 'Matt': 8.6, 'Michael': 9.5}

Ở đây, chúng tôi đã lọc từ điển điểm theo các giá trị của nó. Chỉ có điểm từ 8,5 trở lên mới xuất hiện trong từ điển đã lọc.

Lọc từ điển Python theo nhiều điều kiện

Đương nhiên, bạn có thể kết hợp lọc theo khóa và giá trị theo cách bạn muốn. Bất kể mức độ phức tạp như thế nào, bất kỳ logic lọc nào cũng có thể được sử dụng để lọc từ điển Python, miễn là cuối cùng nó trả về Truehoặc False.

Trong ví dụ bên dưới, chúng tôi lọc từ điển điểm theo tất cả các điều kiện sau:

  • Tên của học sinh phải có 4 ký tự.
  • Tên của học sinh phải bắt đầu bằng chữ “M”.
  • Điểm của học sinh phải trên 8,9.

Lưu ý rằng, mặc dù rõ ràng là phức tạp, nhưng việc kiểm tra từng điều kiện trong số những điều kiện này lại khá đơn giản. Nếu một trong những điều kiện này không được đáp ứng, hàm lọc sẽ trả về False. Nếu không, chức năng chuyển sang điều kiện tiếp theo. Cuối cùng, nếu tất cả các điều kiện được đáp ứng, hàm sẽ trả về True.

Đây là cách nó hoạt động:

def my_filtering_function(pair):
    key, value = pair
    if len(key) != 4:  # first condition
        return False
    if key[0] != 'M':
        return False  # second condition
    if value <= 8.9:
        return False  # third condition
    # If nothing was returned until here, it means that
    # the pair passed all conditions. Keep it in the dictionary!
    return True
 
grades = {'John'7.8'Mary'9.0'Matt'8.6'Michael'9.5}
 
filtered_grades = dict(filter(my_filtering_function, grades.items()))
 
print(filtered_grades)
 
# output:
# {'Mary': 9.0}