确定排名中的关系

时间:2017-04-20 17:52:49

标签: quicksort

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

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

2 个答案:

答案 0 :(得分:0)

这是我将如何做到的:

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开始计数。

答案 1 :(得分:0)

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

添加一个辅助变量(我使用了x)并给它一个0值。在第二个if语句中,添加另一个if语句,检查i [1]是否小于x。如果是这样,请将1添加到ctr。最后,在循环中,将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]

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