On Mar 4, 2009, at 23:59, eric casteleijn wrote:

Geen idee wat je code moet doen, en dus hoe die te verbeteren.


OK, zonder KAPITALEN :-)
De bedoeling is om in een gegeven lijst met tuples, dat punt te vinden dat met de index r in de fact colom wordt aangewezen en waarvan de waarde dan in de data colom staat. De waarden voor fact zijn ook tussen 0..1 en oplopend gesorteerd. Ze markeren een gebied. Waarbij r tussen 0..1 zoek je eerst het interval N .. N+1 waar factN < r < factN+1
vervolgens is het resultaat de interpolatie tussen dataN en dataN+1

(ik weet niet of het zo duidelijker is geworden, mar als je de codde draait zie jet het (waarschijnlijk) zo)
F

import random

def LinearInter(f, a, b):
        return a + (b-a) * f

def FindSegment(r, lijst=None, fact=0, data=1 ):
        if lijst:
                if r <= lijst[0][fact]:
                        return lijst[0][data]
                elif r >= lijst[-1][fact]:
                        return lijst[-1][data]
                else:
                        l = 0
                        h = len(lijst)-1
                        while (h-l) > 1:
                                p = l + (h-l) / 2
                                if r >= lijst[p][fact]:
                                        l = p
                                else:
                                        h = p
                        if l == h:
                                return lijst[l][data]
return LinearInter( (r - lijst[l][fact]) / (lijst[h][fact] - lijst[l][fact]), lijst[l][data], lijst[h][data] )
        else:
                return None

if __name__ == '__main__':
        lijst1 = [ (0.0,  10), (0.5,  20), (0.75, 30), (0.8,  40), (1.0,  50) ]
        lijst2 = [ (0.1,  50), (0.5,  30), (0.75, 10), (0.8,  40), (0.9,  70) ]

        for i in range(101):
                r = i / 100.0
print i, FindSegment(r, lijst1), FindSegment(r, lijst2), FindSegment(random.random(), lijst2)
_______________________________________________
Python-nl mailing list
Python-nl@python.org
http://mail.python.org/mailman/listinfo/python-nl

Antwoord per e-mail aan