【问题标题】:Sort list by frequency but keeping original order when given same frequency按频率排序列表,但在给定相同频率时保持原始顺序
【发布时间】:2020-04-18 20:39:37
【问题描述】:

这是一个让我难过的练习网站(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】:

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

    如果您的意思是 所有 元素如果列表以相同的频率出现,请尝试在对列表进行排序之前添加此检查。

    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]
    

    【讨论】:

    • 遗憾的是,我已经尝试过这种类型的解决方案,但它不起作用 - 运行该函数的检查之一是 "frequency_sort([1, 2, 2, 1]) == [ 1,1,2,2]" 并且此函数未通过该检查。我猜当有多个元素具有相同的倍频时它不起作用。
    • 根据原始问题的引用和我的解决方案中的 all 语句,[1, 2, 2, 1] 的结果应该是“保留原始顺序”,因为事实上,“具有相同频率的元素”。我在这里遗漏了什么?
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多