Comment obtenir la valeur min et max du membre dans la liste en une seule passe ?
Je peux utiliser functools.reduce
ou min
/ max
pour 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 min
et max
en 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
Enregistrer un commentaire