列表中元素的相对顺序

Óla*_*ron 9 python sorting list

我正在编写一个函数,它接受一个整数列表并返回一个相对定位元素的列表.

也就是说,如果我对所述函数的输入是[1,5,4],则输出将是[0,2,1],因为1是最低元素,5是最高元素,4是中间,所有元素是唯一值,还是一组()

但代码说话,我到目前为止的功能是

def relative_order(a):
    rel=[]
    for i in a:
        loc = 0
        for v in a:
            if i > v:
                loc += 1
        rel.append(loc)
    return rel
Run Code Online (Sandbox Code Playgroud)

它确实有效,但由于我将大型列表发送到此函数中,并且我必须将每个元素与每次迭代中的所有元素进行比较,因此需要大约5秒来使用10.000个元素的列表.

我的问题是如何提高所述功能的速度,也许更多Pythonic,我尝试了理解列表,但我的Python技能缺乏,我只想出了实现这个问题的必要方法.

Ósc*_*pez 12

这可以写成列表理解,如下所示:

lst = [1, 5, 4]
s = sorted(lst)    
[s.index(x) for x in lst]
=> [0, 2, 1]
Run Code Online (Sandbox Code Playgroud)

这是另一个测试,使用@ frb的例子:

lst = [10, 2, 3, 9]
s = sorted(lst)    
[s.index(x) for x in lst]
=> [3, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

  • @nightcracker很好,使用这个速度从4.54秒提高到0.52秒. (3认同)
  • 回到这个 - 我删除了我的答案,因为frb显示它是不正确的.我说我以前的评论非常糟糕 - 我的意思是说我不喜欢这个答案的表现(但我非常喜欢答案本身 - 它在概念上很清楚,这非常重要).为了弥补你得到+1 :)这个答案的运行时是O(n ^ 2),这对于大型列表来说非常糟糕.如果性能很重要,我可能会做一个decorate-sort-undecorate构造,但我不确定Python中的性能如何. (2认同)
  • @akk虽然我很欣赏upvote,但我也会指出,如果你不认为答案是值得的,那么低估一个有效的答案(即使它不是最有效的版本)也有点违背SO的精神 - 你不需要赞成它,但我当然认为没有理由对它进行投票.需要我指出你的答案实际上是不正确的(在这个问题上有几个删除的答案也做出了类似的假设 - 包括我自己) - 但是没有人选择向你推崇...... (2认同)

Jon*_*nts 11

这是另一个应该更高效的保持.index进入列表,因为它声明不会发生重复值,所以我们可以执行查找O(1)而不是线性...(并且实际上满足要求):

>>> a = [10, 2, 3, 9]
>>> indexed = {v: i for i, v in enumerate(sorted(a))}
>>> map(indexed.get, a)
[3, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

  • @ÓscarLópez`map(indexed.get,a)`是87.7usec,`[索引[x] for x in a]`是104usec而`[s.index(x)for x in a]`是9.2msec ..那是基于1,000个独特整数的范围(随机洗牌) (3认同)