[python-nl] fast & simple ?

Floris van Manen vm at klankschap.nl
Thu Mar 5 06:07:55 CET 2009


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)


More information about the Python-nl mailing list