2

Que nommez-vous une fonction qui prend une liste et une fonction et renvoie Vrai si l'application de la fonction à tous les éléments donne le même résultat?Y a-t-il un nom standard pour cette fonction?

def identical_results(l, func): 
    if len(l) <= 1: return True 
    result = func(l[0]) 
    for el in l[1:]: 
     if func(el) != result: 
      return False 
    return True 

Y a-t-il un nom généralement accepté pour cette chose? Bonus si vous pouvez mettre en œuvre de manière moins maladroite.

Répondre

5

Dans .NET, le plus proche est Array.TrueForAll.

Peut-être SameForAll serait plus approprié pour cette fonction?

+0

@Dario: Relisez. J'ai édité après mon dernier commentaire. –

+0

Oh, thx: SameForAll est en effet la meilleure proposition que j'ai entendu encore – Dario

0

identical_results sonne comme un nom raisonnable pour moi.

1

ne peut pas penser à un bon nom à ce jour, mais celui-ci fait la même chose:

def identical_results(l, func): 
    return len(set(map(func, l))) <= 1 
+2

code très concise, mais inefficace depuis la création d'un ensemble nécessite O (n log n), alors que l'algorithme doit juste besoin O (n). – Dario

+0

@Dario: Vrai, si c'est un problème. – balpha

+0

Oui, bonne idée balpha. reduce() va fusionner les résultats sans créer un ensemble: def nombre_parfaits (l, func): return reduire (lamdba x, y: x et y, carte (func, l)) Comme c'est la carte + réduire, ceci est très évolutif aussi (voir le papier Mapreduce de Google). –

4

havn't entendu parler d'un nom spécial pour ce encore (un peu similaire à Forall, mais pas exactement) . IdenticalResults semble correct si (Jon Seigel proposé SameForAll, également très agréable)

De plus: C'est la façon dont on pourrait mettre en œuvre cette Haskell en utilisant la fonction all (TrueForall sous .NET)

ident [] = True 
ident (x:xs) = all (== x) xs 

sameForAll f = ident . map f 

Et Python:

def idents(f, list): 
    if len(list) <= 1: 
     return True 
    else: 
     let fx0 = f(list[0]) 
     return all((f(x) == fx0 for x in list[1:])) 
+0

c'est assez de tester si la fonction est constante sur un domaine. – nlucaroni

+0

Je ne suis pas sûr de celui de Haskell, mais le python semble retourner vrai si tous les éléments sont identiques. C'est cool, parce que maintenant je peux appeler 'idents (map (f, list))' pour implémenter SameForAll. Réparez votre code afin que je puisse vous donner une upvote ... – itsadok

+0

Oops, je viens oublié d'appliquer f ;-) – Dario

0

J'ai posté ceci dans un commentaire ci-dessus, mais la mise en forme mais j'ai foiré, si elle est ici à nouveau pour plus de clarté:

def identical_results(l, func): 
    return reduce(lamdba x,y: x and y, map(func, l)) 
+0

Je pense que vous avez la bonne idée, mais comme c'est le cas maintenant, vous avez implémenté TrueForAll au lieu de SameAll – itsadok

+0

. Je pensais que la fonction pourrait faire tout le travail (et elle le peut), mais il serait probablement plus agréable si réduire vérifiait un tableau et seulement ajouté de nouvelles valeurs. Ce serait à peu près un ensemble de toute façon, comme balpha suggéré ci-dessus. –

Questions connexes