我正在尝试创建一个程序,将数字分数从最高到最低排名。
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
答案 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]
这将根据您的脚本执行您想要的操作,但肯定有更有效的方法。