首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据某个键的值对字典列表进行排序,而不使用Python中的sort()

如何根据某个键的值对字典列表进行排序,而不使用Python中的sort()
EN

Stack Overflow用户
提问于 2021-01-17 14:50:25
回答 2查看 59关注 0票数 0

我试图根据key: positive_ratings的值对一个大的json文件进行排序,并且不使用内置的sort()函数。

代码语言:javascript
复制
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']

对于学校,我们必须做一个快速排序功能,排序列表如下所示。现在,我想重写它,以便对字典列表进行排序。

代码语言:javascript
复制
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]))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-17 14:57:22

在代码中,根据元素的值对列表进行排序。但是您想要的是基于element['positive_ratings']的排序列表。您只需稍微修改一下代码:

代码语言:javascript
复制
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函数也是这样工作的,您只需指定键:

代码语言:javascript
复制
some_list.sort(key= lambda x: x['positive_ratings'])

我们可以调整您的代码,使其看起来类似于sort函数:

代码语言:javascript
复制
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)

你可以这样称呼它:

代码语言:javascript
复制
quick_sort(small_example, key = lambda x: x['positive_ratings'])

编辑:我忘了在最后一行中添加键。多亏了达林G,我修正了这个问题

票数 2
EN

Stack Overflow用户

发布于 2021-01-17 15:11:47

通过基于positive_ratings键对数据进行排序,可以对示例进行排序(首先对postive_ratings值进行排序,然后根据此排序返回输出)

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
[{'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}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65762074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档