python - Most efficient way to filter for lowest values in queryset -
given:
some_list = someclass.objects.filter(something=something).order_by('-x','-y') in english: some_list filtered list of someclass objects, ordered 2 values, first x, y.
if want limit number of entries in list value z, can this:
final_list = some_list[:z] but if want limit number of entries value, randomize "cut-off entries" before do? i'm having hard time describing, example:
sc x y 2 3 b 1 2 c 1 1 d 1 1 e 1 1 f 1 0 g 0 3 if z=3 then, using method, final_list = (a,b,c). want final_list include , b because above others(a has greater x others, , b tied second x has greater y), seeing cut-off @ c x=1,y=1, , there 2 other objects "tied" c, third slot c, d, or e.
i pull some_list apart hand , examine values , start putting them final_list until hit z, hoping there better way don't know of. in, less lines of code, less processing power, etc.
so example, expect 1 of these outputs, @ random:
final_list = (a, b, c) final_list = (a, b, d) final_list = (a, b, e) if z = 4, expect 1 of these outputs:
final_list = (a, b, c, d) final_list = (a, b, c, e) final_list = (a, b, d, c) final_list = (a, b, d, e) final_list = (a, b, e, c) final_list = (a, b, e, d) hopefully clear.
you simplistic like, annotating query average values of x , y, , then, picking values above average. example, like:
some_list = someclass.objects.filter( something=something ).annotate( average_x=avg("x"), average_y=avg("y") ).order_by( '-x','-y' ) def passes_threshold(x, y, avgx, avgy): '''simplistic function check if combination of x & y better another. update better suit context. ''' return (x + y) > (avgx + avgy) # use filter instead, if want values list matching, # if want until first few match, required_list = itertools.takewhile(passes_threshold, some_list)
Comments
Post a Comment