Salut,
Envoyé par
Supernul
Si on pouvait enseigner ce type de réflexion aux lycéens et étudiants, informaticiens ou non, ...
S'il y a une réflexion à avoir, c'est plutôt sur comment arriver à connaitre l'existence de trucs pareils et "si je sais" comment s'en rappeler le jour où un cas d'utilisation se présentera (dans quelques semaines ou quelques mois).
Dans la pratique, on ne peut pas et le sujet dans ces cas là est un arbitrage entre trouver un truc magique ou se résoudre à l'écrire soi-même (puisqu'on sait programmer).
Si on part de la solution proposée par Sve@r basée sur "si on ne sait pas le faire par compréhension, on peut quand même le faire avec une boucle simple".
Ca donne:
1 2 3 4 5 6 7
| result = []
for xx, d in zip(Q, norm):
if d > delta:
result.append( xx )
count -= 1
if count == 0:
break |
Pour "condenser" çà en une seule ligne, rien n'empêche d'en faire une fonction et écrire:
result = extract(Q, norm, count, delta)
Et passer d'un tas de lignes de codes à son découpage en fonctions est bien plus important que d'écrire des one-liners car on a déjà non seulement un code fonctionnel mais aussi une interface qui permettra de ré-écrire la fonction un peu plus tard si nécessaire.
Dit autrement, on aurait bien pu commencer par écrire comme VinsS le suggérait:
1 2
| def extract(Q, norm, count, delta):
return [ xx for xx, d in zip(Q, norm) if d > delta ][:count] |
Puis optimiser avec des générateurs:
1 2 3
| def extract(Q, norm, count, delta):
g = (xx for xx, d in zip(Q, norm) if d > delta)
return [ next(g) for _ in range(count) ] |
En connaissant les constructions de base, le programmeur a déjà plein de solutions.
Il peut même retomber sur itertools.islice et écrire:
extract = lambda Q, norm, delta, count: list(itertools.islice((xx for xx,d in zip(Q,norm) if d >= delta), count))
La question pourra être alors de savoir qu'est ce qui sera le plus lisible (dans 6 mois et/ou par les collègues qui auront à revoir le code).
- W
Partager