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']