如何创建排序数组,其顺序与输入相关联

问题描述 投票:1回答:2

基本上我有一个计算人的平均加权分数的函数。如果其中一个输入是name,ex name =“John Smith”,他们的最终成绩是total = 100.如果我再次为另一个人运行该程序,他们的名字=“Bob Joe”,总数= 95并存储每一个。我如何将数字与名称相关联,以便根据总分数增加一系列名称。

我的预期结果是

namesOrder = [100,95,81,55]

gradeOrder = [John Smith,Bob Joe,Billy Kid,Dum Dum]

按收到的分数顺序组织的成绩

python arrays sorting
2个回答
0
投票

有几种方法可以做到这一点。

第一个,也可能是最清楚的,是使用listdicts并按分数键排序:

from operator import itemgetter

unsorted_data = [{'name': 'John Smith', 'score': 100},
                 {'name': 'Dum Dum', 'score': 55},
                 {'name': 'Billy Kid', 'score': 81},
                 {'name': 'Bob Joe', 'score': 95}]

sorted(unsorted_data, key=itemgetter('score'))

输出:

[{'name': 'Dum Dum', 'score': 55}, {'name': 'Billy Kid', 'score': 81}, {'name': 'Bob Joe', 'score': 95}, {'name': 'John Smith', 'score': 100}]

第二个是使用单个dict

scores = {'John Smith': 100, 'Bob Joe': 95, 'Billy Kid': 81, 'Dum Dum': 55}

sorted(scores.items(), key=itemgetter(1))

输出:

[('Dum Dum', 55), ('Billy Kid', 81), ('Bob Joe', 95), ('John Smith', 100)]

这是IMO,不太直观,因为它返回listtuples,你必须按位置索引,而不是明显的字符串键。它节省了一点空间,但这是你几乎从不担心优化的事情,因为你无论如何都在使用Python。

最后一个是基于zip进行排序:

namesOrder = [100, 95, 81, 55]
gradesOrder = ['John Smith', 'Bob Joe', 'Billy Kid', 'Dum Dum']

[name for grade, name in sorted(zip(namesOrder, gradesOrder))]

输出:

['Dum Dum', 'Billy Kid', 'Bob Joe', 'John Smith']

这只返回名称,在某些情况下可能是您想要的名称,如果您的数据包含多个lists,则不需要您创建中间数据结构。

你也可以将reverse=True传递给任何sorted调用,以降序排序,而不是默认的升序。


0
投票

这是我将如何做到这一点的代码(这花了我一段时间):

grades = {}


def ordered_score():
    gradesOrder = []
    namesOrder = []
    for a in sorted(list(grades.values()), reverse=True):
        gradesOrder.append(a)
    for a in gradesOrder:
        for b, c in sorted(list(grades.items())):
            if a == c:
                namesOrder.append(b)
    return gradesOrder, namesOrder


grades['Jacob'] = 52
grades['Elsa'] = 97
grades['Timber'] = 22

new_grades = ordered_score()

print(ordered_score()[0])
print(ordered_score()[1])

打印结果如下所示:

[97, 52, 22]
['Elsa', 'Jacob', 'Timber']
© www.soinside.com 2019 - 2024. All rights reserved.