What's the best way of sorting a python list in an unordered fashion according to the median of value positions in the list?
Suppose:
a = [1, 3 ,6, 7, 10, 12, 17]
I'm looking for this:
a = [1, 17, 7, 3, 12, 6, 10]
Meaning, the list now looks like [start, end, mid, first_half_mid, second_half_mid, ...]
edit: To clarify further, I'm looking for a way to keep bisecting the list until it covers the whole range!
edit2: Another example to illustrate the problem
input:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
desired output:
[1, 10, 6, 3, 9, 2, 5, 8, 4, 7]
UPDATE: consider left element as a middle if the length of the list is an even numer
def f(a):
# take left middle element for even-length lists
mid = len(a)//2 if len(a)%2 else len(a)//2-1
# take len(a)//2 as a middle element
#mid = len(a)//2
if len(a) <= 2:
return a
elif(len(a) == 3):
return a[[0,-1,mid]]
else:
return np.append(a[[0,-1,mid]], f(np.delete(a, [0,len(a)-1,mid])))
Output:
In [153]: f(a)
Out[153]: array([ 1, 17, 7, 3, 12, 6, 10])
OLD answer:
here is one of many possible solutions:
import numpy as np
def f(a):
if len(a) <= 2:
return a
elif(len(a) == 3):
return a[[0,-1,len(a)//2]]
else:
return np.append(a[[0,-1,len(a)//2]], f(np.delete(a, [0,len(a)-1,len(a)//2])))
a = np.array([1, 3 ,6, 7, 10, 12, 17])
In [114]: a
Out[114]: array([ 1, 3, 6, 7, 10, 12, 17])
In [115]: f(a)
Out[115]: array([ 1, 17, 7, 3, 12, 10, 6])
PS about last two numbers in the result list/array - the question is what is the middle index for the 4-elements list?
What is the middle element for [3,6,10,12]
list? In my solution it would be 10
(index: 4//2 == 2
)