簡體   English   中英

如何在 Python 中不使用 sort() 根據某個鍵的值對字典列表進行排序

[英]How to sort a list of dictionaries based on the value of one certain key without using sort() in Python

我正在嘗試根據鍵的值對帶有 Steam 游戲的大型 json 文件進行降序排序:positive_ratings,而不使用內置的 sort() function。

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

output 按降序排列將是以下列表: ['Rust', 'Portal', 'Counterstrike', 'Bioshock Infinite']

對於學校,我們必須進行快速排序 function 排序列表如下。 現在我想重寫它,以便對字典列表進行排序。

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

在您的代碼中,您根據元素的值對列表進行排序。 但是您想要的是基於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 function 也可以這樣工作,您只需指定密鑰:

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,我解決了這個問題

您可以對示例進行排序,通過基於鍵positive_ratings對數據進行排序,即首先對 postive_ratings 值進行排序,然后基於返回 output

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)

output

[{'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}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM