filter()

Meetod filter() on kõige lihtsam. Antud meetod võtab ette kaks argumenti - filtreerimise kriteerium, mis on funktsioon, ja andmekogum, kust me võtame väärtused filtreerimiseks. Meetod loob uut järjendit elementidest, millele kehtib määratud kriteerium. Ilma lambda-ta näeb see välja nii:

# Data to filter
input_list = [10, 27, 56, 90]

# Defining filtering criteria
def filter_criteria(number: int) -> int:
    # We only need numbers that are divisible by 2
    return number % 2 == 0

# Filtering out the values we need, outcome is <filter> object
filtered = filter(filter_criteria, input_list)

# Converting the <filter> object to list and printing its contents
print(list(filtered))  # --> [10, 56, 90]

Olgu meil antud järjend suvaliste numbritega. Meie tahame sellest järjendist saada ainult need numbrid, mis jaguvad 3-ga või 5-ga. Triviaalseks lahenduseks on for-each tsükkel (For-tsükkel):

def get_specific_nums(nums: list) -> list:
    # Declaring an empty list
    specific_nums = []
    # For each number in given list
    for number in nums:
        # Check if number is divisible by 3 OR by 5
        if number % 3 == 0 or number % 5 == 0:
            # Add to a new list
            specific_nums.append(number)

    return specific_nums

print(get_specific_nums([1, 3, 14, 27, 15, 100, 151, 9, 2]))  # --> [3, 27, 15, 100, 9]

Tundub päris mahukas. Ja nüüd teeme sama asja kasutades lambda-t ja meetodit filter():

# no pec # Initial list nums = [1, 3, 14, 27, 15, 100, 151, 9, 2] # Filtering out the values we need, outcome is object filtered = filter(lambda x: x % 3 == 0 or x % 5 == 0, nums) # Converting the object to list and printing its contents print(list(filtered)) # --> [3, 27, 15, 100, 9]

Ehk seitsmest koodireast saime kolm, mis on juba tunduvalt lühem. Tegelikult saab need kolm rida veel korra kokku panna, ja saaksime vaid kaks rida koodi:

# no pec nums = [1, 3, 14, 27, 15, 100, 151, 9, 2] print(list(filter(lambda x: x % 3 == 0 or x % 5 == 0, nums))) # --> [3, 27, 15, 100, 9]

Juba palju parem, eks? Lühike ja ilus lahendus meie probleemile. Veel üks näide:

# no pec words = ["lambdas", "are", "cool", "but", "such", "code", "may be", "difficult", "to read"] # Filtering words by length filtered = filter(lambda word: 6 > len(word) > 3, words) print(list(filtered)) # --> ['cool', 'such', 'code'] # Or print(list(filter(lambda word: 6 > len(word) > 3, words))) # --> ['cool', 'such', 'code']