web-dev-qa-db-fra.com

Python: différence entre filtre (fonction, séquence) et carte (fonction, séquence)

Je lis à travers le Python documentation pour entrer vraiment en profondeur avec le Python Langue et rencontré les fonctions du filtre et de la carte. J'ai déjà utilisé le filtre avant, Mais ne jamais mapper, même si j'ai vu les deux dans diverses Python questions ici à ce sujet.

Après avoir lu sur eux dans le Python Didacticiel, je suis confondu sur la différence entre les deux. Par exemple, de 5.1.3. Outils de programmation fonctionnels :

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

et

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

Celles-ci ressemblaient presque exactement la même chose en fonction de moi, alors je suis allé dans le terminal pour courir Python de manière interactive et testé mon propre cas. J'ai utilisé map pour les première et seconde instances ci-dessus, et pour le premier (return x % 2 != 0 and x % 3 != 0) Il a renvoyé une liste de booléens plutôt que des chiffres.

Pourquoi map renvoie parfois un booléen et d'autres fois la valeur de retour réelle?

Quelqu'un peut-il m'expliquer exactement la différence entre map et filter?

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

est équivalent à

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

Alors que la liste est revenue par

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

est équivalent à result après avoir exécuté

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

Notez que lorsque vous utilisez map, les éléments du résultat sont des valeurs renvoyées par la fonction cube.

En revanche, les valeurs renvoyées par f in filter(f, ...) ne sont pas les éléments de result. f(i) est uniquement utilisé pour déterminer si la valeur i doit être conservée dans result.


Dans python2, map et filter listes de retour. En Python3, map et filter itérateurs de retour. Au-dessus, list(map(...)) et list(filter(...)) est utilisée pour vous assurer que le résultat est une liste.

34
unutbu

map et filter fonction de python est assez différent car ils se produisent très différemment. Ayons un exemple rapide pour les différencier.

Fonction de carte

Définissons une fonction qui prendra un argument de chaîne et vérifiez si elle se présente dans des séquences de lettre de voyelle.

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

Maintenant, créons une fonction de carte pour cela et passons de la chaîne aléatoire.

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

Et oui c'est équivalent à suivre

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

il ira simplement imprimer

True
False
True 

Fonction Filtre

Créons maintenant une fonction filter pour cela et passez une chaîne aléatoire.

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

filter Comme son nom l'indique, filtre l'original ibler et retentit les éléments qui renvoient tristolet pour la fonction fournie à la fonction de filtrage.

Il ira simplement imprimer

a
e

Fourchette ici pour référence future, si vous le trouvez utile.

3
iNet

filtre - renvoie la position de la vraie valeur


var_list = [10,20,0,1]

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

print("Values are",var_b)

Sortie


Les valeurs sont [10, 20, 1]

map - retourne le résultat réel


var_list = [10,20,0,1]

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

print("Values are",var_b)

Sortie


Les valeurs sont [20, 40, 0, 2]

Réduire - Prenez les 2 premiers éléments de la liste, puis appelle la fonction, dans l'appel de fonction suivante, le résultat de l'appel précédent sera le 1er argument et la 3ème élément de la liste sera 2ème argument


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)

Sortie


Valeurs de var_b [20, 40, 0, 2]

Valeurs de var_c 160

1
Sivakumarj

La fonction de filtrage est utilisée pour filtrer les résultats de notre liste d'origine tandis que la fonction Carte est utilisée pour appliquer une fonction sur notre liste d'origine et une nouvelle liste est donc générée. Voir ci-dessous des exemples où la fonction de filtrage est utilisée pour renvoyer des éléments dans la liste uniquement quand ils sont impairs. La fonction Carte est utilisée ci-dessous pour revenir au carré de chaque élément de la liste.

Fonction Lambda: Utilisation de Lambda: La définition Lambda n'inclut pas une déclaration de "retour", elle contient toujours une expression qui est renvoyée. Nous pouvons également mettre une définition de Lambda n'importe où une fonction est attendue et nous n'avons pas à l'attribuer à une variable du tout. C'est la simplicité des fonctions de Lambda.

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

La fonction Filtre () In Python prend une fonction et une liste comme des arguments. Cela offre un moyen élégant de filtrer tous les éléments d'une séquence "séquence", pour laquelle la fonction renvoie true . Voici un petit programme qui renvoie les numéros impairs d'une liste d'entrée:

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

La fonction Carte () In Python prend une fonction et une liste comme argument. Une nouvelle liste est renvoyée en appliquant la fonction à chaque élément de liste.

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

filtre (fonction, iTABLE) fonction (pointeur, comme dans C) retour Boolean Type

carte (fonction, iTable) fonction (pointeur, comme dans c) retour par exemple 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()
0
andrew