编辑数字列表n仅包含0到n

时间:2017-10-30 04:24:46

标签: python python-3.x list

标题不是很好,主要是因为我很难以非常简洁的方式描述问题。如果有人可以在阅读下面的内容后改进标题,那么请这样做。

问题是这个。输入是一个数字数组,如下所示:[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]

2 个答案:

答案 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)

这是另一种替代解决方案,我希望这能解决您的问题。