python - count before, after and between points in an ordered list -


i'm trying create algo compute several counts before, after , between points in ordered list. here "certain points" y values need appended x values , ordered. here simpler illustration of i'm trying do.

x = [2,3,5,6,7,9] y = [1,4,10]  # appending y x , ordering gives us:  full_list = [1,2,3,4,5,6,7,9,10] 

so y = 1 metrics computed non-programmatically slicing full_list so:

num_between_before = len(full_list[0:0]) 0 num_between_after = len(full_list[0:4]) 2 num_before = len(full_list[0:0]) 0 num_after = len(full_list[0:9]) 8 

but of course i'm trying programmatically list x numeric , list y numeric. both x , y can of size len(y) < len(x). full ordered list can have y values distributed anywhere among x values.

programmatically output might this:

# y_val: (num_between_before, num_between_after, num_before, num_after) output: 1:  (0, 2, 0, 8) 4:  (2, 4, 3, 5) 10: (4, 0, 8, 0) 

obviously i'm having trouble here in code far:

x = [1434684599341,1434684606154,1434684607190,1434684613843,1434684677605,      1434684704358,1434684708727,1434684724495,1434684758413,1434684782632]  y = [1434471725039, 1434684613844, 1434684708728, 1434684782633]  y.sort()  in y:     x.append(i)  x.sort()  idx = [] j in y:     idx.append(x.index(j))     counter = 0  i, k in zip(idx, y):      counter += 1     if == 0:         before = len(x[i:i])         after = len(x[i:conv_index[counter]]) - 1         print before, after     elif == idx[-1]:         before = len(x[i-counter:idx[counter-1]]) - 1         after = len(x[i:i])         print before, after     else:         before = len(x[i:idx[counter]])         after = len(x[i:idx[counter]]) - 1         print before, after 

if follow you, think works:

def allcounts(x,y):     z = x+y     z.sort()     d = {}     in y:         d[i] = z.index(i)     counts = {}     i,j in enumerate(y):         if == 0:             counts[j] = (0,d[y[i+1]]-d[j]-1,d[j],len(z)-d[j]-1)         elif < len(y) - 1:             counts[j] = (d[j]-d[y[i-1]]-1,d[y[i+1]]-d[j]-1,d[j],len(z)-d[j]-1)         else:             counts[j] = (d[j]-d[y[i-1]]-1,0,d[j],len(z)-d[j]-1)     return counts 

with test data:

>>> x = [2,3,5,6,7,9] >>> y = [1,4,10] >>> c = allcounts(x,y) >>> c {1: (0, 2, 0, 8), 10: (4, 0, 8, 0), 4: (2, 4, 3, 5)} 

Comments