Как отсортировать список словарей на основе значения одного определенного ключа без использования sort() в Python

#python #sorting #dictionary #key

#python #сортировка #словарь #Клавиша

Вопрос:

Я пытаюсь отсортировать большой json-файл с играми Steam в порядке убывания на основе значения key: positive_ratings, без использования встроенной функции sort() .

 small_example = [
{'id':10,'game':'Counterstrike','positive_ratings':150},
{'id':20,'game':'Bioshock Infinite','positive_ratings':50},
{'id':30,'game':'Rust','positive_ratings':300},
{'id':40,'game':'Portal','positive_ratings':200}
]
 

Вывод в порядке убывания будет следующим списком:
['Rust', 'Portal', 'Counterstrike', 'Bioshock Infinite']

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

 def quick_sort(sequence):
    length = len(sequence)
    if length <= 1:
        return sequence
    else:
        centre = sequence.pop()


    items_bigger = []
    items_smaller = []

    for item in sequence:
        if item > centre:
            items_bigger.append(item)

        else: items_smaller.append(item)

    return quick_sort(items_smaller)   [centre]   quick_sort(items_bigger)


print(quick_sort([1,2,5,6,2,10,34,54,23,1]))
 

Комментарии:

1. использование sorted() if .sort() не разрешено? Но я думаю, что это тоже не будет разрешено

Ответ №1:

В вашем коде вы сортируете список на основе значения элемента. Но то, что вы хотите, — это сортировка списка на основе element['positive_ratings'] . Вам просто нужно немного изменить код:

 def quick_sort(sequence):
    length = len(sequence)
    if length <= 1:
        return sequence
    else:
        centre = sequence.pop()


    items_bigger = []
    items_smaller = []

    for item in sequence:
        if item['positive_ratings'] > centre['positive_ratings']: # I changed only this line
            items_bigger.append(item) 

        else: items_smaller.append(item)

    return quick_sort(items_smaller)   [centre]   quick_sort(items_bigger)
 

sort функция также работает так, вы просто указываете ключ:

 some_list.sort(key= lambda x: x['positive_ratings'])
 

Мы можем настроить ваш код так, чтобы он выглядел похожим на sort function:

 def quick_sort(sequence, key = lambda x: x):
    length = len(sequence)
    if length <= 1:
        return sequence
    else:
        centre = sequence.pop()


    items_bigger = []
    items_smaller = []

    for item in sequence:
        if key(item> key(centre): # I changed only this line
            items_bigger.append(item) 

        else: items_smaller.append(item)

    return quick_sort(items_smaller, key)   [centre]   quick_sort(items_bigger, key)
 

Вы можете назвать это так:

 quick_sort(small_example, key = lambda x: x['positive_ratings'])
 

Редактировать: я забыл добавить ключ в последней строке. Благодаря @DarrylG я исправил это

Комментарии:

1. Я поддержал ваш ответ, прежде чем заметил, что в вашем коде есть ошибка, которая мешает ему работать. Версия с ключом должна быть: `return quick_sort(items_smaller, ключ) [center] quick_sort(items_bigger, ключ)

Ответ №2:

вы можете отсортировать пример, отсортировав данные на основе ключа, positive_ratings т.Е. Сначала отсортировать значения positive_ratings, а затем на основе этого вернуть результат

 small_example = [
{'id':10,'game':'Counterstrike','positive_ratings':150},
{'id':20,'game':'Bioshock Infinite','positive_ratings':50},
{'id':30,'game':'Rust','positive_ratings':300},
{'id':40,'game':'Portal','positive_ratings':200}
]



def func(data, key: int):
    dic = {}
    for i in data:
        if i[key] not in dic:
            dic[i[key]] = [i]
        else:
            dic[i[key]].append(i)
    
    dic_key = list(dic.keys())
    
    # sorting the dic_key, sorting data based on postive_raing values, you can
    # use any sort algo here
    
    for i in range(len(dic_key)):
        for j in range(i 1, len(dic_key)):
            if dic_key[i]>dic_key[j]:
                dic_key[i], dic_key[j] = dic_key[j], dic_key[i]
    
    result = []
    for i in dic_key:
        result.extend(dic[i])
    return result

sol =  func(small_example, 'positive_ratings')
print(solution)
 

вывод

 [{'id': 20, 'game': 'Bioshock Infinite', 'positive_ratings': 50},
 {'id': 10, 'game': 'Counterstrike', 'positive_ratings': 150},
 {'id': 40, 'game': 'Portal', 'positive_ratings': 200},
 {'id': 30, 'game': 'Rust', 'positive_ratings': 300}]