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

Comment signer la connexion OKEx API version 5 avec websockets ?

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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