Как создать отсортированный массив, порядок которого связан с входом - PullRequest
1 голос
/ 26 марта 2019

По сути, у меня есть функция, которая рассчитывает средневзвешенную оценку человека.Если одним из входных данных является имя, ex name = "Джон Смит", а их итоговая оценка - итоговая = 100. Если бы мне пришлось снова запустить эту программу для другого человека, а его имя = "Боб Джо" и итоговое = 95 и сохранитькаждый из них.Как бы я связал числа с именем, чтобы существовал массив имен по возрастанию на основе их общего количества баллов.

Мои ожидаемые результаты:

namesOrder = [100,95,81,55]

gradesOrder = [Джон Смит, Боб Джо, Билли Кид, Dum Dum]

оценки организованы в порядке полученных баллов

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Вот код того, как я это сделаю (это заняло у меня некоторое время):

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']
0 голосов
/ 26 марта 2019

Есть несколько способов сделать это.

Первое, и, вероятно, самое ясное, это использовать list из dicts и сортировать по ключу 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, менее интуитивно, так как он возвращает list из tuples, который вы должны индексировать по позиции, а не очевидный строковый ключ. Это экономит немного места, но это тот тип вещей, о котором вам почти никогда не придется беспокоиться об оптимизации, так как вы все равно используете 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 для сортировки в порядке убывания вместо значения по умолчанию в порядке возрастания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...