【问题标题】:Convert list of N items to relative ordering (0-(N-1))? [duplicate]将 N 个项目的列表转换为相对排序 (0-(N-1))? [复制]
【发布时间】:2015-08-19 17:43:03
【问题描述】:

例如,如果我有一个不同项目的列表:

L = [100,55,104,400]

“相对”排序可以重述:

R = [1,0,2,3]

我不确定如何将 L 转换为 R。起初我只是尝试从所有内容中减去 min(L),但这并没有“压缩”到相对顺序。

我正在寻找一个有效的解决方案(不是 O(n2))。

【问题讨论】:

  • 你也可以查看其他骗子stackoverflow.com/questions/3382352/…
  • 如果您知道基本的内置函数,这非常简单:[i for i, x in sorted(enumerate(L), key=itemgetter(1))] 您可以从operator 模块中获取itemgetter
  • 这是一个不好的例子。一个更好的例子是[100,104,55,400];那应该给[1,2,0,3]还是[2,0,1,3]

标签: python algorithm list


【解决方案1】:

使用sorted 函数和列表推导。

>>> l =  [100,55,104,400]
>>> sortedl = sorted(l)
>>> [sortedl.index(i) for i in l]
[1, 0, 2, 3]

注意,这是 O(n2) 在编辑到问题之前回答

【讨论】:

  • 漂亮而优雅,但请注意,如果列表变大,此解决方案将变得低效(我记得,每个 index() 将是 O(n),使得此解决方案 O(n^2) )
  • @amit 这是我在使用列表推导时遇到的另一个问题
  • @user4967499 如果您正在寻找有效的解决方案,您也应该提及它...
  • @amit 添加了限定符
【解决方案2】:

简单的列表理解:

>>> L = [100, 55, 104, 400]
>>> R = [L.index(i) for i in sorted(L)]
[1, 0, 2, 3]

【讨论】:

    【解决方案3】:

    您可以尝试组合使用列表理解、zipsorted

    >>> [i[1] for i in sorted(zip(L, range(4)))]
    [1, 0, 2, 3]
    

    这是 O(nlogn),因为您只需要排序一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多