Heim  >  Artikel  >  Backend-Entwicklung  >  Das Bisect-Modul verwaltet eine geordnete Liste

Das Bisect-Modul verwaltet eine geordnete Liste

高洛峰
高洛峰Original
2016-10-20 09:38:281157Durchsuche

bisect – Pflegen einer geordneten Liste

Zweck: Es ist nicht erforderlich, jedes Mal „sort“ aufzurufen, um eine geordnete Liste zu verwalten.

Das Bisect-Modul implementiert einen Algorithmus zum Einfügen von Elementen in eine geordnete Liste. In manchen Fällen ist dies effizienter, als die Liste wiederholt zu sortieren oder eine große Liste zu erstellen und diese dann zu sortieren. Bisect bedeutet Dichotomie. Hier wird die Bisektionsmethode zum Sortieren verwendet. Der Quellcode von Bisect ist eine Vorlage für die Bisektionssortierung. Dieses Modul umfasst weniger als 100 Codezeilen.

Einfügen

import bisect
import random
   
# Use aconstant seed to ensure that
# the samepseudo-random numbers
# are usedeach time the loop is run.
random.seed(1)
   
print'New  Pos Contents'
print'---  --- --------'
   
# Generaterandom numbers and
# insert theminto a list in sorted
# order.
l = []
for i inrange(1, 15):
#产生1-100的随机数
    r = random.randint(1, 100)
    position = bisect.bisect(l, r)
    bisect.insort(l, r)
print'%3d  %3d' % (r, position), l

Ausführungsergebnis:

#./bisect_example.py

Neuer Pos-Inhalt

--- - ----------

14 0[14]

85 1[14, 85]

77 1[14, 77, 85]

26 1[14, 26, 77, 85]

50 2[14, 26, 50, 77, 85]

45 2[14, 26, 45, 50, 77, 85]

66 4[14, 26, 45, 50, 66, 77, 85]

79 6[14, 26, 45, 50, 66, 77, 79, 85]

10 0[10, 14, 26, 45, 50, 66, 77, 79, 85]

3 0[3, 10, 14, 26, 45, 50, 66, 77, 79, 85]

84 9[3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85]

44 4[ 3, 10, 14, 26, 44, 45, 50, 66, 77, 79, 84, 85]

77 9[3, 10, 14, 26, 44, 45, 50, 66, 77 , 77, 79, 84, 85]

1 0[1, 3, 10, 14, 26, 44, 45, 50, 66, 77, 77, 79, 84, 85]


Die vom Bisect-Modul bereitgestellten Funktionen sind:

bisect.bisect_left(a,x, lo=0, hi=len(a)) :

Finden Sie den Index, an dem x in die geordnete Liste a eingefügt wird. lo und hi werden verwendet, um den Bereich der Liste anzugeben. Standardmäßig wird die gesamte Liste verwendet. Wenn x bereits existiert, fügen Sie es links ein. Der Rückgabewert ist index.

bisect.bisect_right(a,x, lo=0, hi=len(a))

bisect.bisect(a, x,lo=0, hi=len(a))

Diese beiden ähneln bisect_left, aber wenn x bereits existiert, fügen Sie es rechts ein.

bisect.insort_left(a,x, lo=0, hi=len(a))

Füge x in die geordnete Liste a ein. Der Effekt ist der gleiche wie bei a.insert(bisect.bisect_left(a,x, lo, hi), x).

bisect.insort_right(a,x, lo=0, hi=len(a))

bisect.insort(a, x,lo=0, hi=len(a))

Ähnlich wie insort_left, aber wenn x bereits existiert, fügen Sie es rechts ein.

Funktionen können in zwei Kategorien unterteilt werden: bisect*, die zum Suchen von Indizes verwendet werden. Insort* wird zum eigentlichen Einfügen verwendet. Standardmäßig werden Wiederholungen von rechts eingefügt. Das am häufigsten verwendete ist wahrscheinlich Insort.

Es gibt ein Beispiel für die Berechnung von Noten basierend auf Punktzahlen in den Standards:

>>> def grade(score,breakpoints=[60, 70, 80, 90], grades='FDCBA ') :

... i = halbieren(Haltepunkte, Punktzahl)

... Noten zurückgeben[i]

...

> >> [Note(Punktzahl)für Punktzahl in [33, 99, 77, 70, 89, 90, 100]]

['F', 'A', 'C','C', ' B', 'A', 'A']

Bisect unterstützt keine Schlüsselwortparameter wie sort. Es wird empfohlen, wie folgt damit umzugehen:

>>> data =[('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)]
>>> data.sort(key=lambdar: r[1])
>>> keys =[r[1] for r in data]         #precomputed list of keys
>>> data[bisect_left(keys,0)]
('black', 0)
>>> data[bisect_left(keys,1)]
('blue', 1)
>>> data[bisect_left(keys,5)]
('red', 5)
>>> data[bisect_left(keys,8)]
('yellow', 8)


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn