Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 插入enumerate的替换项,对要传递的元素进行排序,以使关系不';不要增加等级?_Python_Algorithm_Ranking - Fatal编程技术网

Python 插入enumerate的替换项,对要传递的元素进行排序,以使关系不';不要增加等级?

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

我一直希望有人会问这个关于Stackoverflow的具体问题,但因为还没有人问:我如何制作一个迭代器式的枚举来对分数进行排序,这样就不会增加排名数

例如,我想以
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')
>>>