排列元组数组

时间:2014-11-11 02:27:55

标签: python ranking

我有一个数组

array = [('item1',90),('item2',76),('item3',83),('item4',90)]

我希望将其排名为

ranking = [(0,'item1'),(0,'item4'),(2,'item3'),(3,'item2')] // (1)

到目前为止,我使用ranking

完成了这项工作
from ranking import *

>>> array.sort(key=lambda x: x[1],reverse = True)
>>> print [i for i in list(Ranking([i[1] for i in array]))]

这就是我得到的:

[(0, 90), (0, 90), (2, 83), (3, 76)] // (2)

任何人都可以帮我从(2)到(1)吗?我真的不需要使用ranking。我接受任何其他解决方案。

5 个答案:

答案 0 :(得分:2)

array = [('item1',90),('item2',76),('item3',83),('item4',90)]
srt = sorted(array,key=lambda x: x[1], reverse=True)
rankings = []
rank = 0
from itertools import groupby
for k,v in groupby(srt,lambda x: x[1]): # group by score
    grp = [(rank,tup[0]) for tup in v] # get item tup[0] and put it in a tuple with the rank
    rankings += grp
    rank += len(grp) # increase rank for next grouping
print(rankings)
[(0, 'item1'), (0, 'item4'), (2, 'item3'), (3, 'item2')]

答案 1 :(得分:1)

array = [('item1',90),('item2',76),('item3',83),('item4',90)]

def s(t):
    return t[1]

array.sort(reverse = True, key = s)

def rank(array):
    res = []
    for index, tup in enumerate(array):
        if index == 0:
            res.append(tuple([ index, tup[0]]))
        elif tup[1] == array[index -1][1]:
            res.append(tuple([index -1, tup[0]]))
        else:
            res.append(tuple([index , tup[0]]))
    return res
r = rank(array)
print r

输出 - [(0,'item1'),(0,'item4'),(2,'item3'),(3,'item2')]

这可能是非常长的解决方案,但我希望这可以正常工作

答案 2 :(得分:1)

您可以使用Pandas DataFrame执行此操作。我推荐这个解决方案,因为它的语义设计非常适合您希望的目的:

import pandas as pd
df = pd.DataFrame.from_records([('item1',90),('item2',76),
                                ('item3',83),('item4',90)])

在我们操作它之前,这是原始数据框架:

>>> df
       0   1
0  item1  90
1  item2  76
2  item3  83
3  item4  90

现在我们将选择第1列并将其降序排列,并将排名添加回数据框(使用min方法):

>>> df['rank'] = df[1].rank(method='min', ascending=False)
>>> df
       0   1  rank
0  item1  90     1
1  item2  76     4
2  item3  83     3
3  item4  90     1

现在我们将所需的列转换回元组列表,不包括索引:

>>> l = list(df[[0, 'rank']].to_records(index=False))
>>> l
[('item1', 1.0), ('item2', 4.0), ('item3', 3.0), ('item4', 1.0)]

我们可以通过列表理解将其置于所需状态:

>>> l2 = [(i, int(j-1)) for i, j in l]
>>> l2
[('item1', 0), ('item2', 3), ('item3', 2), ('item4', 0)]

答案 3 :(得分:0)

我没有安装排名,因此无法对其进行测试,但documentation表示Ranking()支持传递密钥功能,以便从列表中选择值。

我建议尝试这样的事情:

print Ranking(array, key=lambda x: x[1], reverse=True)

答案 4 :(得分:0)

array = [('item1',90),('item2',76),('item3',83),('item4',90)]
values = sorted(v for k, v in array)
d = dict(zip(values, range(len(values)-1, -1, -1)))
print sorted(( (d[i],item) for (item, i) in array ))

这会产生输出:

[(0, 'item1'), (0, 'item4'), (2, 'item3'), (3, 'item2')]

如何运作

values包含值的排序列表:

[76, 83, 90, 90]

然后我们创建一个字典d来对它们进行排序。 d是:

{76: 3, 83: 2, 90: 0}