Как отсортировать список питонов, используя 2 условных атрибута - PullRequest
0 голосов
/ 24 октября 2018

Допустим, я хочу отсортировать список, который выглядит следующим образом:

arr = ['45621', '78124', '24613']

В приведенном выше списке хранятся идентификаторы для различных сотрудников компании.Я не хочу сортировать только по идентификаторам, но по атрибутам, которые соответствуют идентификаторам, используя следующий словарь:

employees = {
    '45621' : { 'rating' : 3, 'hours_worked' : 42 },
    '78124' : { 'rating' : 4, 'hours_worked' : 78 },
    '24613' : { 'rating' : 3, 'hours_worked' : 51 }
}

Так что это примерно так: если у сотрудника выше rating, его / ее удостоверение личности будет первым.Однако, если у 2 сотрудников одинаковый rating, мы сравниваем hours_worked, и тот, кто работал больше, придет раньше другого.

Сейчас я думаю о 2 разных методах сортировки: вставкаи объединить.Я отредактировал несколько примеров кода из Интернета, но я изо всех сил пытаюсь сравнить второе условие, то есть, когда 2 алгоритма равны для алгоритмов.Например, отредактированные версии моей сортировки вставкой выглядят так:

InsertionSort

def insertionSort(arr):
    for i in range(1, len(arr)): 
        key = employees[ arr[i] ]['rating']
        j = i-1
        # Falls apart after this part
        while j >=0 and key < arr[j] : 
            arr[j+1] = arr[j] 
            j -= 1
        arr[j+1] = key 

Сортировка слиянием кажется еще более сложной, но я пытаюсьпо крайней мере, понять один, чтобы получить представление.

Любая помощь с этими методами сортировки будет принята с благодарностью.Спасибо.

Примечание: я не хочу использовать встроенный механизм сортировки, так как он в основном предназначен для обучения, поэтому он не является дубликатом.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Во-первых, я думаю, что лучше организовывать данные в один список, вам не нужно 2 из них.Примерно так:

employees = [
    {'user_id': '45621', 'rating' : 3, 'hours_worked' : 42 },
    {'user_id': '78124', 'rating' : 4, 'hours_worked' : 78 },
    {'user_id': '24613', 'rating' : 3, 'hours_worked' : 51 }]

, после чего вы можете использовать встроенную функцию sort списка, объединить ее с operator.itemgetter дважды с соответствующими клавишами, которые вы хотите.

Допустим, вы ценитеrating больше hours_worked, сначала нужно отсортировать по менее важному ключу.reverse=False чтобы поставить высокое значение сверху.

Этот способ предоставит вам больше контроля, потому что иногда не обе сортировки находятся в одном и том же порядке.то есть: вы хотите отсортировать rating по убыванию, но hours_worked по возрастанию (пользователь с высоким рейтингом, но с меньшим количеством работы, значит, более эффективный)

import operator
employees.sort(key=operator.itemgetter('hours_worked'), reverse=True)
employees.sort(key=operator.itemgetter('rating'), reverse=True)

Результат:

[{'user_id': '78124', 'rating': 4, 'hours_worked': 78},
 {'user_id': '24613', 'rating': 3, 'hours_worked': 51},
 {'user_id': '45621', 'rating': 3, 'hours_worked': 42}]

Послесортируя, вы можете получить id в порядке, используя понимание списка

[u['user_id'] for u in employees]

, что дает:

['78124', '24613', '45621']
0 голосов
/ 24 октября 2018

Или sorted:

arr=sorted(arr,key=lambda x: (employees[x]["rating"], employees[x]["hours_worked"]))

При необходимости сортировки по убыванию:

arr=sorted(arr,key=lambda x: (employees[x]["rating"], employees[x]["hours_worked"]), reverse=True)
0 голосов
/ 24 октября 2018

Вы можете использовать python list.sort или sorted на основе пользовательского ключа:

arr = ['45621', '78124', '24613']

employees = {
    '45621' : { 'rating' : 3, 'hours_worked' : 42 },
    '78124' : { 'rating' : 4, 'hours_worked' : 78 },
    '24613' : { 'rating' : 3, 'hours_worked' : 51 }
}

arr.sort(key=lambda x: (employees[x]["rating"], employees[x]["hours_worked"]))
print(arr)

результат:

['45621', '24613', '78124']

Кроме того, так как вам нужны ключи с более высоким рейтингомво-первых, вы должны изменить порядок.

arr.sort(key=lambda x: (employees[x]["rating"], employees[x]["hours_worked"]), reverse=True)

Здесь у вас есть живой пример

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