Python根据列表元素出现次数排序

Chekio上面的一道题,觉得挺有意思的,随笔记录一下
比如说
[4, 6, 2, 2, 6, 4, 4, 4]:
4出现的次数最多,6和2出现的次数一样,但是6在2前面,因此该列表根据元素出现次数排序后的结果应该为:
[4, 4, 4, 4, 6, 6, 2, 2]

def frequency_sort(items):
    # your code here
    lst1 = []
    for i in items:
        if i not in lst1:
            lst1.append(i)
    lst = []
    dic = {}
    # # print(lst1)
    for i in lst1:
        dic[i] = items.count(i)
    dic = dict(sorted(dic.items(), key=lambda x:x[1], reverse=True))
    # #print(dic)
    count = 0
    for k, v in dic.items():
        for i in range(v):
            lst.append(k)
    # # print(lst)
    return lst


if __name__ == '__main__':
    print("Example:")
    print(frequency_sort([4, 6, 2, 2, 6, 4, 4, 4]))

    # These "asserts" are used for self-checking and not for an auto-testing
    assert list(frequency_sort([4, 6, 2, 2, 6, 4, 4, 4])) == [4, 4, 4, 4, 6, 6, 2, 2]
    assert list(frequency_sort(['bob', 'bob', 'carl', 'alex', 'bob'])) == ['bob', 'bob', 'bob', 'carl', 'alex']
    assert list(frequency_sort([17, 99, 42])) == [17, 99, 42]
    assert list(frequency_sort([])) == []
    assert list(frequency_sort([1])) == [1]
    print("Coding complete? Click 'Check' to earn cool rewards!")


最开始我使用集合去重,但是发现使用set函数去重把元素的顺序打乱了,破坏了位置稳定性,于是索性使用列表把没在里面的元素加进去,完成一个去重的功能。
还有比较有意思的就是字典排序,可以根据键也可以根据值,记录一下

dic = sorted(dic.items(), key=lambda x:x[1], reverse=True)

首先 - 字典.items(),然后使用匿名函数把字典的值设置为key,也就是根据值排序,sorted默认从小到大,reverse=True设置排序顺序为从大到小

至于这个集合去重,确实有问题,使用之后破坏了元素位置的稳定性,害我找一半天原因,甚至想在字典里倒腾键值对的位置顺序,不过的确挺有意思的,随笔记录一下。

侵删

你可能感兴趣的:(Python学习专栏,python,列表,排序)