标题不是很好,主要是因为我很难以非常简洁的方式描述问题。如果有人可以在阅读下面的内容后改进标题,那么请这样做。
问题是这个。输入是一个数字数组,如下所示:[1,3,4,7]
输出是一个类似这样的数组:[1,2,3,4]
。这是为了指示输入数组中每个数字的等级基于其值。
其他一些例子:
In[1] : [4,3,7,9]
Out[1] : [2,1,3,4]
In[2] : [0,4,1,9]
Out[2] : [0,2,1,3]
In[3] : [1,0,0,0]
Out[3] : [1,0,0,0]
这里需要注意的一个特点是,当一个数组包含零时,它必须从零开始排序,而对于In[1]
,因为它不包含零,所以数组从1开始排名。
目前,我正在使用此代码:
def argsort(seq):
ix = list(range(len(seq)))
ix.sort(key=lambda x: seq[x])
out = [0] * len(i)
for i, x in enumerate(ix):
if seq[x] != 0:
out[x] = i
if 0 in seq:
return out
else:
return [each+1 for each in out]
目前,该解决方案适用于前两种情况。但是,它在案例3中失败并返回结果:[3,0,0,0]
答案 0 :(得分:1)
看起来你有一个python列表而不是numpy数组(因为你已被标记),所以你可以这样做:
inList = [4,3,7,9]
sortedinList = sorted(set(inList))
outList = [sortedinList.index(e)+ (0 not in inList) for e in inList]
由于您需要重复项的相同索引,因此您可以使用set
而不是list
来获取索引。
<强>输出强>
>>> inList = [4,3,7,9]
>>> outList
[2,1,3,4]
>>> inList = [0,4,1,9]
>>> outList
[0,2,1,3]
>>> inList = [1,0,0,0]
>>> outList
[1,0,0,0]
答案 1 :(得分:0)
John Doe
输出:
def argsort(seq):
sorted_seq = sorted(seq)
res = []
for _ in sorted_seq:
my_index = seq.index(_)
res.append(my_index)
seq[my_index] = '$'
return res
if __name__ == "__main__":
my_list = [4,3,7,9]
print argsort(seq=my_list)
这是另一种替代解决方案,我希望这能解决您的问题。