itertools.ifilter Vs. filtre de Vs. interprétations de la liste
Je suis en train de devenir de plus en plus familiers avec le itertools
module et ont trouvé une fonction appelée ifilter
.
De ce que je comprends, c'filtres et itératif basé sur la fonction donnée et renvoie un itérateur sur une liste contenant les éléments de l'objet iterable sur lequel la fonction est évaluée à True
.
Question 1: ma connaissance, jusqu'à présent correct?
Question 2: hormis le fait que ce retourne et itérateur, comment est-il différent de l'intégré dans filter
fonction?
Question 3 Qui est le plus rapide?
De ce que je peux dire, il ne l'est pas. Ai-je raté quelque chose? (J'ai couru à la suite de l'essai)
>>> itertools.ifilter(lambda x: x%2, range(5))
<itertools.ifilter object at 0x7fb1a101b210>
>>> for i in itertools.ifilter(lambda x: x%2, range(5)): print i
...
1
3
>>> filter(lambda x: x%2, range(5))
[1, 3]
>>> function = lambda x: x%2
>>> [item for item in range(5) if function(item)]
[1,3]
- Quelle sortie vous attendiez-vous?
range(5)
vous donnera[0,1,2,3,4]
. - notez que la plupart des usages de filtre peut être remplacé par un garde sur un générateur d'expression de liste:
list(x for x in range(5) if x%2)
Vous devez vous connecter pour publier un commentaire.
L'exemple ci-dessous comprend un générateur de nombres qui imprime un message tout de suite, avant de céder au nombre, montre comment
filter()
première construit la liste, puis traverse que et filtre. Alors queitertools.ifilter
filtres comme il va, jamais la construction d'une liste. Si vous êtes de filtrage de 500 000 des choses importantes, vous voulezifilter
, de sorte que vous n'êtes pas la construction d'une liste.De sortie:
Votre compréhension est corret: la seule différence est que
ifilter
retourne un itérateur, tout en utilisantfilter
, c'est comme appeler:Vous pourriez également être intéressé par ce que PEP 289 dit à propos de filtre et ifilter:
Également noter que
ifilter
est devenufilter
en Python-3 (donc à l'écart des itertools).ifilter
retourne un générateur, et non une liste.Générateurs de créer leurs articles à la volée si nécessaire, au lieu d'allouer la totalité de la liste de la première. C'est la seule différence entre
ifilter
etfilter
Ici, vous pouvez voir la diference:
filtre(fonction, objet iterable): Construire une liste à partir de ces éléments de itératif de la fonction renvoie la valeur true.
itertools.ifilter(prédicat, objet iterable): Faire un itérateur qui filtre les éléments de itérable retour uniquement ceux pour lesquels le prédicat est Vrai.
Cela signifie que pour obtenir 'ifiltered' éléments que vous devez effectuer une itération avec itérateur renvoyé, mais "filtre" renvoie tous les éléments dans une liste avec itération nécessaire.