121 votes

Un code utile qui utilise reduce() ?

Est-ce que quelqu'un ici a un code utile qui utilise la fonction reduce() en python ? Y a-t-il du code autre que les habituels + et * que l'on voit dans les exemples ?

Voir Le sort de reduce() dans Python 3000 par GvR

65voto

Claudiu Points 58398

Les autres utilisations que j'ai trouvées en dehors de + et * étaient avec et et ou, mais maintenant nous avons any et all pour remplacer ces cas.

foldl et foldr reviennent souvent dans Scheme...

Voici quelques utilisations mignonnes :

Aplatir une liste

Objectif : tourner [[1, 2, 3], [4, 5], [6, 7, 8]] en [1, 2, 3, 4, 5, 6, 7, 8] .

reduce(list.__add__, [[1, 2, 3], [4, 5], [6, 7, 8]], [])

Liste des chiffres d'un numéro

Objectif : tourner [1, 2, 3, 4, 5, 6, 7, 8] en 12345678 .

C'est laid et lent :

int("".join(map(str, [1,2,3,4,5,6,7,8])))

Pretty reduce manière :

reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8], 0)

51voto

J.F. Sebastian Points 102961

reduce() peut être utilisé pour trouver Le plus petit commun multiple pour 3 nombres ou plus :

#!/usr/bin/env python
from fractions import gcd
from functools import reduce

def lcm(*args):
    return reduce(lambda a,b: a * b // gcd(a, b), args)

Ejemplo:

>>> lcm(100, 23, 98)
112700
>>> lcm(*range(1, 20))
232792560

39voto

J.F. Sebastian Points 102961

reduce() pourrait être utilisé pour résoudre des noms en pointillés (où eval() est trop dangereux pour être utilisé) :

>>> import __main__
>>> reduce(getattr, "os.path.abspath".split('.'), __main__)
<function abspath at 0x009AB530>

23voto

ssoler Points 923

Trouvez l'intersection de N listes données :

input_list = [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]

result = reduce(set.intersection, map(set, input_list))

retours :

result = set([3, 4, 5])

via : Python - Intersection de deux listes

11voto

mweerden Points 4291

L'utilisation de reduce que j'ai trouvé dans mon code concernait la situation où j'avais une structure de classe pour l'expression logique et j'avais besoin de convertir une liste de ces objets d'expression en une conjonction d'expressions. J'avais déjà une fonction make_and pour créer une conjonction à partir de deux expressions, j'ai donc écrit reduce(make_and,l) . (Je savais que la liste n'était pas vide, sinon cela aurait été quelque chose comme reduce(make_and,l,make_true) .)

C'est exactement la raison pour laquelle (certains) programmeurs fonctionnels comme reduce (ou pliage comme on appelle généralement ces fonctions). Il existe souvent déjà de nombreuses fonctions binaires comme + , * , min , max la concaténation et, dans mon cas, make_and et make_or . Avoir un reduce rend trivial le passage de ces opérations à des listes (ou des arbres ou tout ce que vous avez, pour les fonctions de pliage en général).

Bien sûr, si certaines instanciations (comme les sum ) sont souvent utilisés, alors vous ne voulez pas continuer à écrire reduce . Cependant, au lieu de définir le sum avec un for-loop, vous puede tout aussi facilement le définir avec reduce .

La lisibilité, comme l'ont mentionné d'autres personnes, est effectivement un problème. On pourrait cependant affirmer que la seule raison pour laquelle les gens trouvent reduce moins "claire", c'est parce qu'il ne s'agit pas d'une fonction que beaucoup de gens connaissent et/ou utilisent.

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