Подтвердить что ты не робот

Python: Разница между фильтром (функция, последовательность) и карта (функция, последовательность)

Я читаю документацию Python, чтобы действительно углубленно изучать язык Python и сталкивался с функциями фильтра и карты. Я использовал фильтр раньше, но никогда не отображал карту, хотя я видел как в различных вопросах Python здесь, на SO.

Прочитав о них в учебнике Python, я смущен различием между ними. Например, из 5.1.3. Функциональные средства программирования:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

и

>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

Они выглядели почти точно так же, как и функция для меня, поэтому я пошел в терминал, чтобы запустить Python в интерактивном режиме и проверить свой собственный случай. Я использовал map для первого и второго экземпляров выше, а для первого (return x % 2 != 0 and x % 3 != 0) он вернул список логических чисел, а не цифр.

Почему map иногда возвращает логическое и другое время фактическое возвращаемое значение?

Может кто-нибудь объяснить мне именно разницу между map и filter?

4b9b3361

Ответ 1

list(map(cube, range(1, 11)))

эквивалентно

[cube(1), cube(2), ..., cube(10)]

Пока список возвращен

list(filter(f, range(2, 25)))

эквивалентно result после запуска

result = []
for i in range(2, 25):
    if f(i):
        result.append(i)

Обратите внимание, что при использовании map элементы в результате являются значениями, возвращаемыми cube функции.

Напротив, значения, возвращаемые f в filter(f,...), не являются элементами в result. f(i) только используется, чтобы определить, если значение i должен храниться в result.


В Python2 map и filter возвращают списки. В Python3 map и filter возвращают итераторы. Выше, list(map(...)) и list(filter(...)) используется, чтобы гарантировать, что результатом является список.

Ответ 2

filter(), как следует из его названия, фильтрует исходную итерацию и сохраняет элементы, которые возвращают True для функции, предоставленной для filter().

map() с другой стороны, примените предоставленную функцию к каждому элементу итерируемого и верните список результатов для каждого элемента.

Следуя приведенному вами примеру, давайте сравним их:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(f, range(11))  # the ones that returns TRUE are 1, 5 and 7
[False, True, False, False, False, True, False, True, False, False, False]
>>> filter(f, range(11))  # So, filter returns 1, 5 and 7
[1, 5, 7]

Ответ 3

Функция map и filter в python сильно отличается, потому что они работают по-разному. Позвольте иметь быстрый пример, чтобы дифференцировать их.

функция карты

Давайте определим функцию, которая примет строковый аргумент и проверит, присутствует ли она в последовательностях гласных букв.

def lit(word):
    return word in 'aeiou'

Теперь давайте создадим для этого функцию карты и передадим некоторую случайную строку.

for item in map(lit,['a','b','e']):
    print(item)

И да, это эквивалентно следующему

lit('a') , lit('b') , lit('e')

просто напечатает

True
False
True 

функция фильтра

Теперь давайте создадим для этого функцию filter и передадим некоторую случайную строку.

for item in filter(lit,['a','b','e']):
    print(item)

filter как следует из названия, фильтрует исходную итерацию и сохраняет элементы, которые возвращают True для функции, предоставленной функции фильтра.

Просто распечатает

a
e

Разместите его здесь для дальнейшего использования, если вы найдете это полезным.

Ответ 4

Фильтруйте --Returns положение истинного значения


var_list = [10,20,0,1]

var_b = list(filter(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

Выход


Значения [10, 20, 1]

Карта --Returns фактический результат


var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values are",var_b)

Выход


Значения [20, 40, 0, 2]

Уменьшите --Take первые 2 элемента в списке, затем вызовите функцию. При следующем вызове функции результатом предыдущего вызова будет 1-й аргумент, а 3-м элементом в списке будет 2-й аргумент.


from functools import *

var_list = [10,20,0,1]

var_b = list(map(lambda var_a : var_a*2,var_list))

print("Values of var_b ",var_b)

var_c = reduce(lambda a,b:a*2,var_b)

print("Values of var_c",var_c)

Выход


Значения var_b [20, 40, 0, 2]

Значения var_c 160

Ответ 5

фильтр (функция, итерируемая) функция (указатель, как в C) возвращает логический тип

функция map (function, iterable) (указатель, как в C) возвращает, например, int

def filterFunc(x):
    if x & 1 == 0:
        return False
    return True


def squareFunc(x):
    return x ** 2


def main():
    nums = [5, 2, 9, 4, 34, 23, 66]
    odds = list(filter(filterFunc, nums))   # filter(function, iterable)
    print(odds)

    square = list(map(squareFunc, nums))    # map(function, iterable)
    print(square)


if __name__ == '__main__':
    main()

Ответ 6

Функция фильтра используется для фильтрации результатов из нашего исходного списка, тогда как функция карты используется для применения некоторой функции в нашем исходном списке, и, следовательно, создается новый список. Ниже приведены примеры, где функция фильтра используется для возврата элементов в списке, только когда они нечетные. Функция карты используется ниже для возврата квадрата каждого элемента в списке.

Лямбда-функция: использование лямбда-выражения: лямбда-определение не содержит оператора return, оно всегда содержит возвращаемое выражение. Мы также можем поместить лямбда-определение везде, где ожидается функция, и нам вообще не нужно присваивать ее переменной. Это простота лямбда-функций.

g = lambda x: x*x*x 
print(g(5)) 
#125

Функция filter() в Python принимает в качестве аргументов функцию и список. Это предлагает элегантный способ отфильтровать все элементы последовательности "sequence", для которой функция возвращает True. Вот небольшая программа, которая возвращает нечетные числа из списка ввода:

li = [4,5,7,8,9] 
final_list = list(filter(lambda x: (x%2 != 0) , li)) 
print(final_list)
#[5,7,9]

Функция map() в Python принимает в качестве аргумента функцию и список. Новый список возвращается путем применения функции к каждому элементу списка.

li = [5, 7, 4, 9] 
final_list = list(map(lambda x: x*x , li)) 
print(final_list)
#[25, 49, 16, 81]