127 votes

Comment utiliser python map et d'autres outils fonctionnels

C'est un peu n00bish, mais j'essaie d'apprendre/comprendre la programmation fonctionnelle en python. Le code suivant :

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3]

def maptest(foo, bar):
    print foo, bar

map(maptest, foos, bars)

produit :

1.0 1
2.0 2
3.0 3
4.0 None
5.0 None

Q. Existe-t-il un moyen d'utiliser map ou tout autre outil fonctionnel en python pour produire ce qui suit sans boucles, etc.

1.0 [1,2,3]
2.0 [1,2,3]
3.0 [1,2,3]
4.0 [1,2,3]
5.0 [1,2,3]

Juste à titre d'information, comment la mise en œuvre changerait-elle s'il existe une dépendance entre foo et bar ?

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3,4,5]

et imprimer :

1.0 [2,3,4,5]
2.0 [1,3,4,5]
3.0 [1,2,4,5]
...

**P.S : Je sais comment le faire naïvement en utilisant des if, des boucles et/ou des générateurs, mais j'aimerais apprendre comment réaliser la même chose en utilisant des outils fonctionnels. Est-ce qu'il suffit d'ajouter une instruction if à maptest ou d'appliquer une autre carte de filtre aux barres en interne dans maptest ? **

11voto

import itertools

foos=[1.0, 2.0, 3.0, 4.0, 5.0]
bars=[1, 2, 3]

print zip(foos, itertools.cycle([bars]))

6voto

Nikhil Chelliah Points 3463

Voici une vue d'ensemble des paramètres de la fonction map(function, *sequences) fonction :

  • function est le nom de votre fonction.
  • sequences est un nombre quelconque de séquences, qui sont généralement des listes ou des tuples. map va itérer sur eux simultanément et donner les valeurs actuelles à function . C'est pourquoi le nombre de séquences doit être égal au nombre de paramètres de votre fonction.

On dirait que tu essaies d'itérer pour une partie de function mais en gardant d'autres constants, et malheureusement map ne soutient pas ça. J'ai trouvé une ancienne proposition d'ajouter une telle fonctionnalité à Python, mais la construction des cartes est tellement propre et bien établie que je doute que quelque chose comme ça soit jamais implémenté.

Utilisez une solution de contournement comme les variables globales ou les compréhensions de liste, comme d'autres l'ont suggéré.

0voto

Chris Points 13472

Est-ce que ça ferait l'affaire ?

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3]

def maptest2(bar):
  print bar

def maptest(foo):
  print foo
  map(maptest2, bars)

map(maptest, foos)

0voto

user2467675 Points 41

Que dites-vous de ça ?

foos = [1.0,2.0,3.0,4.0,5.0]
bars = [1,2,3]

def maptest(foo, bar):
    print foo, bar

map(maptest, foos, [bars]*len(foos))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X