【Python CheckiO 题解】Sort Array by Element Frequency

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,传送门:https://checkio.org/,本博客主要记录自己在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。

题目描述

【Sort Array by Element Frequency】:对给定的可迭代对象,按照它们在列表中出现的次数进行排序,如果两个元素出现的次数相同,则按照元素在原来列表出现的先后顺序进行排序。

【输入】:可迭代的列表

【输出】:排序后的列表

【前提】:元素可以是 int 或 string 类型

【范例】

frequency_sort([4, 6, 2, 2, 6, 4, 4, 4]) == [4, 4, 4, 4, 6, 6, 2, 2]
frequency_sort(['bob', 'bob', 'carl', 'alex', 'bob']) == ['bob', 'bob', 'bob', 'carl', 'alex']

解题思路

利用 collections 模块的 Counter() 方法,统计元素的出现次数,将元素作为 key,出现次数作为 value,以字典的键值对形式存储,调用 most_common() 方法将其按照出现次数进行排序

排序过后是一个列表,列表内元素为元组的形式,遍历该列表,将元素乘以其出现的次数,依次添加到一个新的列表当中,这个新列表就是排序过后的列表

代码实现

from collections import Counter

def frequency_sort(items):
    items2 = []
    items = Counter(items).most_common()
    for i in items:
        items2.extend([i[0]] * i[1])
    return items2


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!")

大神解答

大神解答 NO.1

def frequency_sort(items):
    return sorted(items, key=lambda x: (-items.count(x), items.index(x)))

大神解答 NO.2

from collections import Counter
from itertools import repeat

def frequency_sort(items):
    return [x for y in (repeat(*x) for x in Counter(items).most_common()) for x in y]
发布了115 篇原创文章 · 获赞 348 · 访问量 37万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览