[EMAIL PROTECTED] wrote: > Can some one help me improve this block of code...this jus converts the > list of data into tokens based on the range it falls into...but it > takes a long time.Can someone tell me what can i change to improve > it... > > def Tkz(tk,data): > no_of_bins = 10 > tkns = [] > dmax = max(data)+1 > dmin = min(data) > rng = ceil(abs((dmax - dmin)/(no_of_bins*1.0))) > rngs = zeros(no_of_bins+1) > for i in xrange(no_of_bins+1): > rngs[i] = dmin + (rng*i) > for i in xrange(len(data)): > for j in xrange(len(rngs)-1): > if data[i] in xrange(rngs[j],rngs[j+1]): > tkns.append( str(tk)+str(j) ) > return tkns
Use bisect(), e. g., with a slightly modified function signature: from __future__ import division import bisect from math import ceil def tkz(tk, data, no_of_bins=10): dmax = max(data) + 1 dmin = min(data) rng = ceil((dmax - dmin)/no_of_bins) rngs = [dmin + rng*i for i in xrange(1, no_of_bins+1)] tokens = [tk + str(i) for i in xrange(no_of_bins)] return [tokens[bisect.bisect(rngs, v)] for v in data] if __name__ == "__main__": print tkz("token_", [5, 7, 8, 9, 70, 200]) What are the tokens for, by the way? I'd recommend using the indices directly if possible. Peter -- http://mail.python.org/mailman/listinfo/python-list