【问题标题】:Python -- rank tuples by first item, resolve ties by second itemPython -- 按第一项对元组进行排名,按第二项解决关系
【发布时间】:2015-09-30 14:37:46
【问题描述】:

我有以下元组列表:

[(1, 6), (2, 3), (2, 5), (2, 2), (1, 7), (3, 2), (2, 2)]

我想按元组中的第一个值对该列表进行排名,并按第二个值解析平局,因此输出如下所示:

[1, 5, 6, 3, 2, 7, 3]

我想不出一个简单的方法来做到这一点,所以我一直在寻找类似scipy.stats.rankdata 函数的东西。但是,对于我的用例,它缺少 numpy.argsort 中的 order 参数之类的东西。我觉得我在这里遗漏了一些明显的东西,在这种情况下,我很抱歉没有更好地搜索我的答案!

编辑:

为了更好地解释我想要实现的目标:

给定一个元组列表

>>> l = [(1, 6), (2, 3), (2, 5), (2, 2), (1, 7), (3, 2), (2, 2)]

我想创建一个列表,其中包含列表 l 中元素的排名。例如,按每个元组中的第一个值排序:

>>> from scipy import stats
>>> stats.rankdata([i for i, j in l], method='min')
array([ 1.,  3.,  3.,  3.,  1.,  7.,  3.])

这几乎是我想要的,但是列表中有关系(有两次 1. 和四次 3.)。

我想使用每个元组中的第二个值打破平局,例如,两个元组 (2, 2) 将具有相同的排名,但 (2, 3) 和 (2, 5) 将有不同的等级。结果列表应如下所示:

array([ 1.,  5.,  6.,  3.,  2.,  7.,  3.])

【问题讨论】:

  • “通过第二个值解决关系” - 什么?
  • 对不起,我应该更好地解释自己。我的意思是我想像往常一样对列表进行排名(使用元组中的第一个值, scipy.stats.rankdata 将完全做到这一点),但是当有平局时,而不是为所有平局项目分配相同的排名,我想要使用元组中的第二个值打破平局。不确定这是否能更好地解释它?

标签: python ranking


【解决方案1】:

Python 自然地对序列进行排序。

>>> [x for x, y in sorted(enumerate([(1, 6), (2, 3), (2, 5), (2, 2), (1, 7), (3, 2), (2, 2)], start=1), key=operator.itemgetter(1))]
[1, 5, 4, 7, 2, 3, 6]

【讨论】:

  • 感谢您的回答!它不会产生与我想要的完全相同的输出(请参阅问题中的示例),但是您的回答帮助我找到了解决方案!
【解决方案2】:

感谢 Ignacio Vazquez-Abrams 的 answer 我设法找到了解决方案!这可能不是最有效的方法,但它确实有效。

>>> import operator
>>> from scipy import stats
>>> l = [(1, 6), (2, 3), (2, 5), (2, 2), (1, 7), (3, 2), (2, 2)]
>>> uniq = list(set(t for t in l))
>>> s = sorted(uniq)
>>> r = [s.index(i) for i in l]
>>> rank = stats.rankdata(r, method='min')
>>> rank
array([ 1.,  5.,  6.,  3.,  2.,  7.,  3.])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 2012-05-28
    • 2022-01-15
    • 2022-01-28
    • 1970-01-01
    • 2017-06-16
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多