Comment trouver un indice à partir duquel un nouvel élément qui peut être inséré dans la liste triée et garder un tri?
a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
Je veux savoir qui a
devrait être en 6ème position dans la liste ordonnée b
.
Ce qui est le plus pythonic moyen de le faire?
a
seront effectivement en 6ème position dansb
, pas la 4e. Et comme @madjar noté, utilisé lebisect
module.bisect.bisect(b, a)
pour obtenir la position (oubisect_[left|right]
) et pour l'insertionbisect.insort(b, a)
ouinsort[left|right]
.- connexes stackoverflow.com/questions/1109804/...
Vous devez vous connecter pour publier un commentaire.
Utilisation traversent,. Ce n'est pas la plus belle de l'API, mais c'est exactement ce dont vous avez besoin.
Vous aurez envie d'utiliser
bisect.bisect
, qui renvoie exactement ce que vous voulez.coupent
est un module en Python Standard Library qui est parfait pour cette tâche. La fonctionbisect
dans le modulebisect
vous donnera l'indice du point d'insertion de la valeur.Permettez-moi de donner un exemple de code pour
bisect
Le résultat sera
5
parce que la liste est basée sur 0, donc en fait c'est la 6ème position.Ce que vous pouvez faire savoir est d'utiliser le résultat pour un
insert
.ou sans l'intermédiaire de la variable
Maintenant
b
sera[0, 10, 30, 60, 100, 132, 150, 210, 280, 340, 480, 530]
.Il existe d'autres préoccupations avec des cas limites. Par exemple, supposons que vous souhaitez sélectionner les éléments susmentionnés
b
dans la gamme de(a, c)
et vous chercher à l'aide deensuite, vous devez penser au cas où
a, c
sont en fait des éléments deb
. Notez quepermettrait à la fois de donner de l'indice 2. Ainsi, si
a=10
nous avons besoin de réduire l'indice de 1. Heureusement, il existe une fonctionbisect.bisect_left
qui fait exactement cela, c'est à dire, dans notre exempledonne 1.
Dans l'ensemble, la gauche de l'indice doit être calculé à l'aide de
bisect.bisect_left()
et l'index droitbisect.bisect_right()
(qui est le même quebisect.bisect()
).