CheckIO是一个通过闯关游戏学习编程的网站(Python和JavaScript)。通过解题开发新“岛屿”,同时,通过做任务获得Quest Points解锁会员题目。
文章内容:题目、我自己的思路和代码以及优秀代码,如果想看大神解题可以直接跳到“优秀代码”部分。
本题链接:https://py.checkio.org/en/mission/frequency-sorting/
题目
这一任务需要根据列表中元素的个数进行排序,如果不同元素个数相同,则根据大小进行排序。例如:[5, 2, 4, 1, 1, 1, 3]
==> [1, 1, 1, 2, 3, 4, 5]
输入: 列表
输出: 列表
举个栗子:
frequency_sorting([5, 3, 8, 11, 5, 6, 6, 5]) == [5, 5, 5, 6, 6, 3, 8, 11]
用处: 用于使用数学统计和数学分析来分析数据,以及发现趋势和预测未来的变化(系统、现象等)
假设:
列表长度 <= 100
最大数值 <= 100
题目框架
def frequency_sorting(numbers):
#replace this for solution
return numbers
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!")
难度: Elementary+
思路及代码
思路
- 计算各个元素出现次数,形成字典;
- 对字典按键进行排序(形成由元组组成的列表);
- 按元组第二个元素(字典的值)进行排序;
- 结果输出。
代码
def frequency_sorting(numbers):
count = {i:numbers.count(i) for i in numbers} #计算各元素出现次数
count = sorted(count.items(), key = lambda x:x[0]) #按键进行排序
#按值进行排序
for i in range(1, len(count)):
for j in range(0, len(count) - i):
if count[j][1] < count[j+1][1]:
temp = count[j]
count[j] = count[j+1]
count[j+1] = temp
#输出结果
result = []
for i in count:
for j in range(i[1]):
result.append(i[0])
return result
优秀代码
No.1
def checkio(numbers):
return sorted(sorted(numbers), key=numbers.count, reverse=True)
先对 numbers
元素进行排序,然后按照每个元素的次数进行排序。
如果不先对 numbers
元素排序的话,最后的结果会按照元素在 numbers
里出现的顺序排列,如:
def checkio(numbers):
return sorted(numbers, key=numbers.count, reverse=True)
# 结果:[99, 45, 99, 6, 6, 45, 1, 2, 13, 34]
No.2
def checkio(numbers):
return sorted(numbers, key=lambda x: (-numbers.count(x), x))