这是一个让我感到难过的练习网站(checkio)。我需要创建一个接受列表并按频率(最高->最低)对其进行排序的函数。没问题,但是我的问题是,当出现具有相同频率的元素时,还需要保留列表的原始顺序。
见下文。
import collections
from collections import Counter
def frequency_sort(items):
if len(items) > 0:
counts = collections.Counter(items)
print(sorted(items, key=lambda x: (counts[x], x), reverse=True))
else:
print([])
if __name__ == '__main__':
(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']
(frequency_sort([17, 99, 42])) == [17, 99, 42]
(frequency_sort([])) == []
(frequency_sort([1])) == [1]
数字3输出错误,“ [17,42,99]”。我对如何解决这个问题很迷失。
当出现具有相同频率的元素时
如果表示列表以相同的频率出现,则表示该all元素,请在对列表进行排序之前尝试添加此检查。
def frequency_sort(items):
if len(items) > 0:
counts = collections.Counter(items)
if len(set(counts.values())) > 1:
print(sorted(items, key=lambda x: (counts[x], x), reverse=True))
else:
print(items)
else:
print([])
将所有不同的counts
值收集到一个set
中将丢弃任何重复的频率,然后您可以询问有多少个不同的频率。如果仅1返回原始列表,否则对其进行排序。
这将导致:
>>> frequency_sort([17, 99, 42])
[17, 99, 42]