py.CheckiO刷题—O‘REILLY岛:Frequency Sorting

本文介绍了如何使用Python实现根据列表中元素频率排序的两种方法,包括冒泡排序结合集合和字典计数的变式。重点讲解了如何在频率相等时按原位置顺序排列。适合理解和应用到实际编程中解决数据处理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目背景:

你的任务是按照列表中数字的频率对列表进行排序。如果几个数字的频率相等,则应根据其自然顺序进行排序。例如:[5,2,4,1,1,1,3]==>[1,1,1,2,3,4,5](意思就是按列表中元素个数的多少进行排序,从多到少,如果元素个数相同则按自然数的顺序从小到大排)

这个是变式:Sort Array by Element Frequency(根据列表元素数量排序,频率相等则按原位置顺序排)

Example:

frequency_sorting([5, 3, 8, 11, 5, 6, 6, 5]) == [5, 5, 5, 6, 6, 3, 8, 11]

代码实现:

法一:用冒泡排序和集合

def frequency_sorting(numbers):
    temp=list(set(numbers))
    for i in range(1,len(temp)):
        for j in range(0,len(temp)-i):
            if numbers.count(temp[j])<numbers.count(temp[j+1]):
                temp[j],temp[j+1]=temp[j+1],temp[j]
            if numbers.count(temp[j])==numbers.count(temp[j+1]) and temp[j]>temp[j+1]:
                temp[j],temp[j+1]=temp[j+1],temp[j] 
            #这一步等于在set后面一行temp.sort()
    lists=[]
    for i in temp:
        for j in range(numbers.count(i)):
            lists.append(i)
    return lists


if __name__ == "__main__":
    print("Example:")
    print(frequency_sorting([1, 2, 3, 4, 5]))

    # These "asserts" using only for self-checking and not necessary for auto-testing
    assert frequency_sorting([1, 2, 3, 4, 5]) == [1, 2, 3, 4, 5], "Already sorted"
    assert frequency_sorting([3, 4, 11, 13, 11, 4, 4, 7, 3]) == [
        4,
        4,
        4,
        3,
        3,
        11,
        11,
        7,
        13,
    ], "Not sorted"
    assert frequency_sorting([99, 99, 55, 55, 21, 21, 10, 10]) == [
        10,
        10,
        21,
        21,
        55,
        55,
        99,
        99,
    ], "Reversed"
    print("Coding complete? Click 'Check' to earn cool rewards!")

 法二:用变式的字典法(这个方法可以说是通用的)

def frequency_sort(items):
    dicts={i:items.count(i) for i in items}
    dicts=dict(sorted(dicts.items(),key=lambda x:x[0],reverse=False))
    dicts=dict(sorted(dicts.items(),key=lambda x:x[1],reverse=True))
    lists=[]
    for i in dicts:
        for j in range(dicts[i]):
            lists.append(i)
    return lists
print(frequency_sort([99, 99, 55, 55, 21, 21, 10, 10]))

思路分析:

其实这两个解法都先是把列表中的重复元素删除得到单一元素的列表,要想删除元素中的重复元素,由上述解法知道有字典法和集合法,还有一种比较好的方法是逻辑判断法:

def setlist(list1):
    for i in list1:
        if i not in list2:
            list2.append(i)
    return list2

然后得到了所有单一元素的列表后,按元素个数的多少进行高到低的排序,当元素个数一样的时候,这里的题目是按自然数从小到大的顺序排列即count相等时,冒泡交换的条件是j>j+1。

Best Code:

def checkio(numbers):
    return sorted(sorted(numbers), key=numbers.count, reverse=True)
def frequency_sorting(numbers):
    return sorted(numbers, key=lambda a: (-numbers.count(a), a))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的思路很明确

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值