【问题标题】:How to create a sorted Array who's order is associated to an input如何创建一个排序数组,其顺序与输入相关联
【发布时间】:2019-08-16 06:14:52
【问题描述】:

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

我的预期结果是

namesOrder = [100,95,81,55]

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

按分数顺序排列的成绩

【问题讨论】:

  • 你可以用字典

标签: python arrays sorting


【解决方案1】:

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

第一个,可能也是最清楚的,是使用dicts 中的list 并按score 键排序:

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,则不需要您创建中间数据结构。 p>

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

【讨论】:

    【解决方案2】:

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

    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']
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 2021-05-15
      • 1970-01-01
      • 2022-01-07
      • 2019-04-02
      • 2011-06-21
      • 2012-02-14
      • 2021-09-11
      相关资源
      最近更新 更多