Some syntactic sugar changes and little embellishment, otherwise there are at least two similar answers in this post. I am posting this since unlike other posts, this post can get the "argsort" in descending manner as well.
from collections import namedtuple
from array import array
def argsort(seq, reverse=False):
index = sorted(range(len(seq)), key=lambda x: seq[x] if not reverse else -seq[x])
sorted_number = sorted(seq, reverse=reverse)
argsorted = namedtuple('argsorted_info', ['sorting_index','sorted_number', 'original_number'])
return argsorted(index, sorted_number, seq)
# Works for integers
a = argsort([3,1,7,5,9,4])
print(a)
b = argsort([3,1,7,5,9,4], reverse=True)
print(b)
# Works for float (beware of truncation)
a = argsort([1.3,1.1,1.7,1.5,1.9,1.4])
print(a)
b = argsort([1.3,1.1,1.7,1.5,1.9,1.4], reverse=True)
print(b)
# Works for array
c = argsort(array('l',[3,1,7,5,9,4]))
print(c)
d = argsort(array('l',[3,1,7,5,9,4]), reverse=True)
print(d)
gives the output as
argsorted_info(sorting_index=[1, 0, 5, 3, 2, 4], sorted_number=[1, 3, 4, 5, 7, 9], original_number=[3, 1, 7, 5, 9, 4])
argsorted_info(sorting_index=[4, 2, 3, 5, 0, 1], sorted_number=[9, 7, 5, 4, 3, 1], original_number=[3, 1, 7, 5, 9, 4])
argsorted_info(sorting_index=[1, 0, 5, 3, 2, 4], sorted_number=[1, 3, 4, 5, 7, 9], original_number=array('l', [3, 1, 7, 5, 9, 4]))
argsorted_info(sorting_index=[4, 2, 3, 5, 0, 1], sorted_number=[9, 7, 5, 4, 3, 1], original_number=array('l', [3, 1, 7, 5, 9, 4]))
argsorted_info(sorting_index=[1, 0, 5, 3, 2, 4], sorted_number=[1.1, 1.3, 1.4, 1.5, 1.7, 1.9], original_number=[1.3, 1.1, 1.7, 1.5, 1.9, 1.4])
argsorted_info(sorting_index=[4, 2, 3, 5, 0, 1], sorted_number=[1.9, 1.7, 1.5, 1.4, 1.3, 1.1], original_number=[1.3, 1.1, 1.7, 1.5, 1.9, 1.4])