Python按第一项对元组进行排序,按第二项对ties进行解析

2024-06-28 19:44:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下元组列表:

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

我希望按元组中的第一个值对该列表进行排序,并按第二个值来解析ties,这样输出如下所示:

^{pr2}$

我想不出一个简单的方法来实现这一点,所以我在寻找类似于scipy.stats.rankdata函数的东西。但是,对于我的用例,它缺少一些东西,比如numpy.argsort中的order参数。我觉得我错过了一些显而易见的东西,在这种情况下,我为没有更好地在谷歌上搜索我的答案而道歉!在

编辑:

为了更好地解释我的目标:

给出元组列表

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

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

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

Tags: 方法函数numpy列表排序statsorderscipy
2条回答

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]

多亏了伊格纳西奥·巴斯克斯·艾布拉姆斯的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.])

相关问题 更多 >