donné une classés liste comme [1.1, 2.2, 3.3]
et une valeur de sélection tel que math.pi*2
, retourner la valeur la plus proche pour toute valeur donnée de [0 - math.pi*2)
Une façon élégante de trouver la valeur la plus proche dans une liste ordonnée circulaire
la fonction doit retourne l'index de la valeur, de sorte que les rendements f(1.2)
0
en f(2.1)
retours 1
et f(6.0)
devrait envelopper autour de math.pi*2
et retour 0
, étant plus proche de 1,1 que de 3,3 étant donné la valeur de sélection. Juste pour être entièrement explicite, cette fonction devrait également être appliquée à l'extrémité inférieure, de sorte que f(1.0, [5.0, 6.0], bound = math.pi*2)
renvoie 1
.
Le cas d'utilisation est de mapper un angle arbitraire en radians à l'angle valide existant le plus proche dans la liste. J'ai écrit ce genre de fonction quelques fois en python avec bisect
, mais le code finit toujours par offenser mes sens esthétiques. La complexité élevée et le nombre de cas de bords semblent hors de proportion avec la simplicité intuitive de la fonction. Donc, je demande si quelqu'un peut trouver une mise en œuvre agréable, à la fois en termes d'efficacité et d'élégance.
Pourquoi ne vérifiez-vous pas d'abord la condition de bouclage, puis effectuez une recherche binaire? – Blender