识别等级关系

Identifying ties in rank

我正在尝试创建一个程序来将数值分数从最高到最低排序。

for i in scores:
    if i[1] == max_score:
        print 'rank ', ctr,'highest score: {}  of {}'.format(i[1], i[0])
        pass

    if i[1] not in [max_score, min_score]:
        ctr= ctr+1
        print'rank ', ctr,'score: {} of {}'.format(i[1], i[0])
        pass



    if i[1] == min_score:
        ctr= ctr+1
        print 'rank ',ctr,'lowest score: {}  of {}'.format(i[1], i[0])

文本文件包含:

john = 10
johnny=10
joseph = 9
j=9
jose = 8
q=7

然而,我的代码的输出是:

rank  1 highest score: 10.0  of john 
rank  1 highest score: 10.0  of johnny
rank  2 score: 9.0 of joseph 
rank  3 score: 9.0 of j
rank  4 score: 8.0 of jose 
rank  5 lowest score: 7.0  of q

我会这样做:

ordered_score_values = sorted(set([s[1] for s in scores]), reverse=True)
for i in scores:
    ctr = (ordered_score_values.index(i[1])) + 1
    if i[1] == max_score:
        print 'rank ', ctr, 'highest score: {}  of {}'.format(i[1], i[0])

    if i[1] not in [max_score, min_score]:
        print 'rank ', ctr, 'score: {} of {}'.format(i[1], i[0])

    if i[1] == min_score:
        print 'rank ', ctr, 'lowest score: {}  of {}'.format(i[1], i[0])

您的示例的变量 ordered_score_values 将包含 [10, 9, 8, 7]。原因如下:set 消除了重复项。 sorted 将它们按顺序排列,reverse 决定顺序是从高到低。

每个人的排名都是这样计算的;我们添加 + 1 因为列表是零索引的,但你更愿意从 1 开始计数而不是 0.

虽然答案已经被接受,但我想提供一种使用您给定代码的方法。每次通过第二个 if 语句时,您的代码都会更新 ctr,这就是它一直在计数的原因。您需要一种方法来检查该分数是否等于另一个分数。

添加一个辅助变量(我用的是 x)并给它一个 0 值。在第二个 if 语句中,添加另一个 if 语句检查 i[1] 是否小于 x。如果是,则将 ctr 加 1。最后,在您的循环中,将 x 值设置为 i[1]。

scores={}
ctr=1
ctr1=2
ctr3=3

files=open("test.txt","r").readlines()
scores = [i.split('=') for i in files]
scores = [[i[0], float(i[1])] for i in scores]
scores = sorted(scores, key=lambda x: -x[1])

print scores
max_score = max([i[1] for i in scores])
min_score = min([i[1] for i in scores])

x = 0
for i in scores:
    if i[1] == max_score:
        print 'rank ', ctr,'highest score: {}  of {}'.format(i[1], i[0])
        pass

    if i[1] not in [max_score, min_score]:
        if i[1] < x:
            ctr = ctr + 1
        print'rank ', ctr,'score: {} of {}'.format(i[1], i[0])
        pass



    if i[1] == min_score:
        ctr= ctr+1
        print 'rank ',ctr,'lowest score: {}  of {}'.format(i[1], i[0])
    x = i[1]

这将根据您的脚本执行您想要的操作,但肯定有更有效的方法来执行此操作。