2009-03-09 5 views
4

Comment exécuter une opération sur une collection en Python et collecter les résultats?Comment lancer une opération sur une collection en Python et collecter les résultats?

Donc, si j'ai une liste de 100 numéros, et je veux exécuter une fonction comme celui-ci pour chacun d'eux:

Operation (originalElement, anotherVar) # returns new number. 

et de recueillir le résultat comme ceci:

résultat = une autre liste ...

Comment faire? Peut-être en utilisant des lambdas?

Répondre

12

List comprehensions. En Python ressemble à quelque chose comme:

a = [f(x) for x in bar] 

Où f (x) est une fonction et un bar est une séquence.

Vous pouvez définir f (x) en fonction partiellement appliquée avec une construction comme:

def foo(x): 
    return lambda f: f*x 

qui retourne une fonction qui multiplie le paramètre par x. Un exemple trivial de ce type de construction utilisé dans une compréhension de la liste ressemble à:

>>> def foo (x): 
...  return lambda f: f*x 
... 
>>> a=[1,2,3] 
>>> fn_foo = foo(5) 
>>> [fn_foo (y) for y in a] 
[5, 10, 15] 

Bien que je ne pense pas utiliser ce genre de construction dans tous les cas, mais assez ésotérique. Python n'est pas un vrai langage fonctionnel, donc il a moins de possibilités de faire des astuces avec des fonctions plus élevées que (disons) Haskell. Vous pouvez trouver des applications pour ce type de construction, mais ce n'est pas vraiment que pythonic. Vous pouvez obtenir une transformation simple avec quelque chose comme:

>>> y=5 
>>> a=[1,2,3] 
>>> [x*y for x in a] 
[5, 10, 15] 
+1

foo (x, autreVar)? –

+0

Merci, c'est assez bonne syntaxe. –

+0

Mykola: Selon ce que vous voulez, je dirais y = 4; a = [f (x, y) pour x dans bar] ou a = [f (x, y) pour x, y dans zip (bar, baz)]. Voir aussi izip. –

1

Une autre méthode (un peu dépréciée) de le faire est:

def kevin (v): retour v * v

vals = plage (0100)

carte

(kevin, vals)

+0

IIRC implémenté comme un wrapper autour des listes de compréhension. – ConcernedOfTunbridgeWells

Questions connexes