按频率排序列表,但在给定相同频率时保持原始顺序

问题描述 投票:0回答:1

这是一个让我感到难过的练习网站(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]”。我对如何解决这个问题很迷失。

python-3.x list sorting collections frequency
1个回答
0
投票

当出现具有相同频率的元素时

如果表示列表以相同的频率出现,则表示该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]
© www.soinside.com 2019 - 2024. All rights reserved.