根据键的值列出键

2024-04-25 17:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本python字典,名为marks:

marks={’joe’:4, ’suzan’:5, ’peter’:4, ’bob’:4, ’john’:6, ’ann’:5, ’fred’:3}

我想根据学生在那次考试中的排名列出他们的名单。更准确地说,建立一个列表排名,以便:

  1. rank[0]包含最佳学生名单
  2. rank[1]包含次优学生名单等

输出应为:

[[’john’], [’ann’, ’suzan’], [’joe’, ’bob’, ’peter’], [’fred’]]

有人能帮我吗?我试了一段时间,但没有找到任何简单的解决办法。。 谢谢


Tags: 列表字典fredjohn学生peterbobjoe
3条回答

通用算法(在伪代码中)如下所示:

temp = {}
for student, rank in marks:
    if not temp has key rank:
        temp[rank] = []
    push student to temp[rank]
keys = sort keys of temp
result = []
for key in keys:
    push temp[key] to result
return result

更新:

Python实现:

marks={'joe':4, 'suzan':5, 'peter':4, 'bob':4, 'john':6, 'ann':5, 'fred':3}

temp = {}

for student in marks:
    mark = marks[student]
    if not temp.has_key(mark):
        temp[mark] = []
    temp[mark].append(student)

ranks = sorted([v for v in temp])
ranks.reverse()

result = []

for rank in ranks:
    result.append(temp[rank])

print result

一行

marks = {'ann': 5, 'bob': 4, 'fred': 3, 'joe': 4, 'john': 6, 'peter': 4, 'suzan': 5}

[[name for name, val in marks.items() if val == score]\
 for score in sorted(set(marks.values()))]

编辑:为清晰起见,更改了名称。你知道吗

Python有一些很棒的内置库,比如itertools和operator。你知道吗

这里有一行:

from itertools import groupby
from operator import itemgetter

marks = {'ann': 5, 'bob': 4, 'fred': 3, 'joe': 4, 'john': 6, 'peter': 4, 'suzan': 5}

print [[name for name, rank in g] for k, g in groupby(sorted(marks.iteritems(), key=itemgetter(1), reverse=True), key=itemgetter(1))]

我的实现主要基于示例here。你知道吗

相关问题 更多 >