So finden Sie einen index, an dem ein neues Element eingefügt werden können sortierte Liste und halten Sie es sortiert?
a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
Ich will wissen, dass a
sollte in der 6. position in der geordneten Liste b
.
Was die meisten pythonic Weg, dies zu tun?
a
tatsächlich in der 6. position inb
, nicht der 4. Division. Und wie @madjar angemerkt, verwendet diebisect
Modul.bisect.bisect(b, a)
zu bekommen die position (oderbisect_[left|right]
) und zum einsetzenbisect.insort(b, a)
oderinsort[left|right]
.- im Zusammenhang stackoverflow.com/questions/1109804/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden halbieren. Es ist nicht die schönste API, aber es ist genau das, was Sie brauchen.
Werden Sie verwenden möchten
bisect.bisect
gibt genau, was Sie wollen.halbieren
ist ein Modul in der Python-Standard-Bibliothek, die ist perfekt für diese Aufgabe. Die Funktionbisect
im Modulbisect
geben Sie den index der Einfügemarke für den Wert.Lassen Sie mich ein code-Beispiel für
bisect
Wird das Ergebnis
5
denn die Liste ist 0-basiert, also in der Tat, es ist der 6. position.Was können Sie tun, wissen, ist das Ergebnis für eine
insert
.oder ohne die temporäre variable
Nun
b
wird[0, 10, 30, 60, 100, 132, 150, 210, 280, 340, 480, 530]
.Gibt es weitere Probleme mit der edge-Fällen. Angenommen, Sie möchten, wählen Sie die Elemente in der oben genannten
b
im Bereich von(a, c)
und Sie wählen, Sie aus mitdann müssen Sie denken über den Fall, wo
a, c
sind eigentlich Elemente derb
. Beachten Sie, dasswürden beide geben den index 2. Also wenn
a=10
wir müssen niedriger der index, der von 1. Zum Glück gibt es eine Funktionbisect.bisect_left
die genau das tut, nämlich, in unserem Beispielgibt 1.
Insgesamt, der linke index berechnet werden soll mit
bisect.bisect_left()
und den rechten indexbisect.bisect_right()
(das ist das gleiche wiebisect.bisect()
).