Python -- 按第一项排列元组,按第二项解决关系

Python -- rank tuples by first item, resolve ties by second item

我有以下元组列表:

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

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

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

我想不出一个简单的方法来做到这一点,所以我一直在寻找类似 scipy.stats.rankdata function. However, for my use-case it's missing something like the order argument in numpy.argsort 的东西。我觉得我在这里遗漏了一些明显的东西,在这种情况下,我为没有更好地谷歌搜索我的答案而道歉!

编辑:

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

给定一个元组列表

>>> 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.])

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]

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

>>> 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.])