54 votes

zipAvec analogique en Python?

Quel est l'analogue de la fonction zipWith de Haskell en Python?

 zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
 

57voto

map()

 map(operator.add, [1, 2, 3], [3, 2, 1])
 

Bien qu'une CL avec zip() soit généralement utilisée.

 [x + y for (x, y) in zip([1, 2, 3], [3, 2, 1])]
 

41voto

dsign Points 3001

Vous pouvez créer le vôtre, si vous le souhaitez, mais en Python, nous le faisons principalement

 list_c = [ f(a,b) for (a,b) in zip(list_a,list_b) ] 
 

car Python n'est pas intrinsèquement fonctionnel. Il arrive juste de prendre en charge quelques idiomes de commodité.

12voto

heinrich5991 Points 765

Vous pouvez utiliser la carte:

 >>> x = [1,2,3,4]
>>> y = [4,3,2,1]
>>> map(lambda a, b: a**b, x, y)
[1, 8, 9, 4]
 

6voto

Taurus Olson Points 1354

Un paresseux zipWith avec itertools:

 import itertools

def zip_with(f, *coll):
    return itertools.starmap(f, itertools.izip(*coll))
 

Cette version généralise le comportement de zipWith avec un nombre illimité d'itérables.

4voto

Abhijit Points 24122

Généralement, comme d'autres l'ont mentionné carte et zip peut vous aider à reproduire la fonctionnalité de zipWith comme dans Haskel.

Généralement, vous pouvez soit appliquer un définies opérateur binaire ou certaines fonction binaire sur deux de la liste.Un exemple pour remplacer un Haskel zipWith avec Python carte/zip

Input: zipWith (+) [1,2,3] [3,2,1] 
Output: [4,4,4] 

>>> map(operator.add,[1,2,3],[4,3,2])
[5, 5, 5]
>>> [operator.add(x,y) for x,y in zip([1,2,3],[4,3,2])]
[5, 5, 5]
>>> 

Il existe d'autres variations de zipWith aka zipWith3, zipWith4 .... zipWith7. Pour reproduire ces functionalists vous souhaiterez peut-être utiliser izip et imap au lieu de zip et de la carte.

>>> [x for x in itertools.imap(lambda x,y,z:x**2+y**2-z**2,[1,2,3,4],[5,6,7,8],[9,10,11,12])]
>>> [x**2+y**2-z**2 for x,y,z in itertools.izip([1,2,3,4],[5,6,7,8],[9,10,11,12])]
[-55, -60, -63, -64] 

Comme vous pouvez le voir, vous pouvez opérer de n'importe quel nombre de la liste que vous désirez et vous pouvez toujours utiliser la même procédure.

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