Python 插入enumerate的替换项,对要传递的元素进行排序,以使关系不';不要增加等级?
我一直希望有人会问这个关于Stackoverflow的具体问题,但因为还没有人问:我如何制作一个迭代器式的枚举来对分数进行排序,这样就不会增加排名数 例如,我想以Python 插入enumerate的替换项,对要传递的元素进行排序,以使关系不';不要增加等级?,python,algorithm,ranking,Python,Algorithm,Ranking,我一直希望有人会问这个关于Stackoverflow的具体问题,但因为还没有人问:我如何制作一个迭代器式的枚举来对分数进行排序,这样就不会增加排名数 例如,我想以score,name的形式给出分数和名称排序列表的排名 scores = [(42, 'Adams'), (42, 'Douglas'), (41, 'Aaron'), (41, 'Hall'), (39, 'Python')] 我可以用enumerate得到每个名字的位置 for i, (s, name) in
score
,name
的形式给出分数和名称排序列表的排名
scores = [(42, 'Adams'), (42, 'Douglas'), (41, 'Aaron'),
(41, 'Hall'), (39, 'Python')]
我可以用enumerate得到每个名字的位置
for i, (s, name) in enumerate(scores, 1):
print i, s, name
但每一条线都会降低排名,即使两条或更多条线在同一个分数上并列。这是
我知道我需要相同的API用于函数,因此它是enumerate的替代品,如何在不增加分数的情况下实现这一点?这被描述为
以下是:
当我第一次开始我目前工作的地方时,我遇到了这个具体的问题,当时我正在用卡车运送培训材料,但当我爬上排名时,我感到沮丧,因为我的排名比其他与我并列的人低。这是我对代码库的第一次贡献,但收紧了一点(因为令人尴尬的是,我第一次没有使用
enumerate
)
我的解决方案是使用一个我最初建模的生成器(参见上面的问题)
使用方法:
for i, (s, name) in rank(scores, 1):
print i, s, name
将打印:
1 42 Adams
1 42 Douglas
3 41 Aaron
3 41 Hall
5 39 Python
从维基百科条目来看,标准竞赛排名最有可能从1开始,因此更改为默认的开始值 此例程自动处理初始化,无需任意值,并且依赖于iterable中每个项的项[0]具有可比性
>>> def sc_rank(iterable, start=1):
"""Standard competition ranking"""
first = True
for n, item in enumerate(iterable, start):
if first:
first = False
lastresult, lastrank = item[0], n
yield start, item
else:
if item[0] == lastresult:
yield lastrank, item
else:
yield n, item
lastresult, lastrank = item[0], n
>>> for scr, item in sc_rank(scores):
print(scr, item)
1 (42, 'Adams')
1 (42, 'Douglas')
3 (41, 'Aaron')
3 (41, 'Hall')
5 (39, 'Python')
>>>
我会把得分相等的项目分组。一个关于如何计算分数的
键
参数可能是一个有用的补充(或者如果你不需要它,它可能只是粗糙的)。@user2357112我很好奇,你会怎么做?没什么特别有趣的。我试过了,结果没有比你的更干净,因为你希望在完成一个小组时排名按小组的大小而不是1来提升。@user2357112你建议的时候我也试过了,但结果不太好。这实际上看起来有点复杂。我看不出有什么好处。我现在也看不出来了。我把它记下来了。
for i, (s, name) in rank(scores, 1):
print i, s, name
1 42 Adams
1 42 Douglas
3 41 Aaron
3 41 Hall
5 39 Python
>>> def sc_rank(iterable, start=1):
"""Standard competition ranking"""
first = True
for n, item in enumerate(iterable, start):
if first:
first = False
lastresult, lastrank = item[0], n
yield start, item
else:
if item[0] == lastresult:
yield lastrank, item
else:
yield n, item
lastresult, lastrank = item[0], n
>>> for scr, item in sc_rank(scores):
print(scr, item)
1 (42, 'Adams')
1 (42, 'Douglas')
3 (41, 'Aaron')
3 (41, 'Hall')
5 (39, 'Python')
>>>