【问题标题】:I want some help on how to sort a list based on its element frequency [duplicate]我需要一些关于如何根据元素频率对列表进行排序的帮助[重复]
【发布时间】:2019-09-17 07:08:37
【问题描述】:

我有一个清单

list1 = [4,6,2,2,2,6,4,4,4]

我想根据元素出现的频率对其进行排序。

排序后的列表应该是这样的:

[4,4,4,4,2,2,2,6,6]

我已将元素和元素频率存储在字典中。我想对这本字典进行排序。到它的价值而不是关键。这是我无法编码的部分。

我已经编写了以下代码。我有元素的频率,但我不知道如何排序。

def checkio(data):

    list1 = [4,6,2,2,2,6,4,4,4]
    list2 = list(dict.fromkeys(list1))
    print(list2)
    d = {}
    list4, result = [], []

    for i in list2:
        d[i] = list1.count(i)

    for i in list2:
        list3 = [i]*d[i]
        list4.append(list3)
    for sublist in list4:
        for item in sublist:
            result.append(item)

    return(result)

【问题讨论】:

  • 只是sorted(list1, key=list1.count, reverse=True)
  • @1v3m 这是一个非常低效的解决方案,请参阅您发布的解决方案作为副本
  • 为了高效和原生的方式,您可以查看this,因为问题已关闭,我无法发布它

标签: python python-3.x


【解决方案1】:

简短的答案在评论中,但它有一个小的性能缺陷。你也可以使用collections.Counter:

import collections

list1 = [4,6,2,2,2,6,4,4,4]
c = collections.Counter(list1)
sorted_list1 = sorted(list1, key=lambda k: c[k], reverse=True)

这对所有元素只计算一次,这样可以在非常大的列表上提供更好的性能。

【讨论】:

  • 谢谢!但是 Py.CheckiO(我正在做这个问题的站点)不支持集合。另外,你能解释一下 lambda 函数吗?谢谢
  • @KunalJain 与其询问 lambda 做什么,不如通读 Python 教程并学习语言 docs.python.org/3/tutorial
  • 然后使用key=list1.countsorted-函数会为它遇到的每个项目调用这个方法,因此每个项目都访问整个列表以便对其进行计数;这是性能受到影响的地方。 lambda 函数是简写,因为sorted 将调用通过key 给出的函数,只有一个参数,即被排序的项目。 lambda 函数从Counter-object 检索预先计算的出现次数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多