Comment obtenir la valeur min et max du membre dans la liste en une seule passe ?

Je peux utiliser functools.reduceou min/ maxpour obtenir le nombre minimum et maximum de membres dans une liste. Mais pour obtenir les deux en une seule passe, j'ai besoin d'écrire une boucle:

from functools import reduce
class foo:
def __init__(self,value): self.value = value

x = []
x.append(foo(1))
x.append(foo(2))
x.append(foo(3))
min_value = reduce(lambda a,b: a if a.value < b.value else b,x).value
max_value = reduce(lambda a,b: a if a.value > b.value else b,x).value
print(min_value)
print(max_value)
min_value2 = min(x,key=lambda a: a.value).value
max_value2 = max(x,key=lambda a: a.value).value
print(min_value2)
print(max_value2)
min_value3 = x[0].value
max_value3 = x[0].value
for f in x:
if f.value < min_value3: min_value3 = f.value
if f.value > max_value3: max_value3 = f.value

print(min_value3)
print(max_value3)

Est-il possible d'obtenir minet maxen une seule passe sans écrire une boucle simple?


Solution du problème

Vous pouvez utiliser un tuple comme agrégateur. Quelque chose comme ça peut-être?

min_value, max_value = reduce(lambda a, b: 
(a[0] if a[0].value < b.value else b, a[1] if a[1].value > b.value else b),
x,
(x[0], x[1]))

La sortie doit être un tuple où le premier est le minimum et le second le maximum.

Exemple dans le REPL, démontrant que les objets demandés sont retournés, et que les valeurs sont correctes:

>>> class foo:
... def __init__(self,value): self.value = value
...
>>> ls = [foo(1), foo(2), foo(3)]
>>> min_value, max_value = reduce(lambda a, b: (a[0] if a[0].value < b.value else b, a[1] if a[1].value > b.value else b), ls, (ls[0], ls[1]))
>>> min_value
<__main__.foo object at 0x10bd20940>
>>> min_value.value
1
>>> max_value.value
3

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"