【问题标题】:Take a list, sort by popularity and then remove duplicates [duplicate]列出一个列表,按受欢迎程度排序,然后删除重复项 [重复]
【发布时间】:2011-02-01 11:13:26
【问题描述】:

可能重复:
In python, how do I take the highest occurrence of something in a list, and sort it that way?

大家好,

我正在寻找一种简单的方法来按受欢迎程度对列表进行排序,然后删除重复元素。

例如,给定一个列表:

[8, 8, 1, 1, 5, 8, 9]

然后我会得到如下列表:

[8, 1, 5, 9]

【问题讨论】:

  • 你应该举一个更好的例子。在您的中,流行顺序与数字的自然顺序相同。如果你有两个 9,会是 [1,3,9,5] 吗?
  • 是的。很抱歉造成混乱!
  • @kahm:您不能按受欢迎程度对列表进行排序。您必须创建一些包含计数的其他中间结构。你还看过哪些其他结构?

标签: python


【解决方案1】:
>>> lst = [1, 1, 3, 3, 5, 1, 9]
>>> from collections import Counter
>>> c = Counter(lst)
>>> [i for i, j in c.most_common()]
[1, 3, 5, 9]

请参阅 collections.Counter 文档以获取与旧版本兼容的实现的链接。

【讨论】:

  • 您应该提到Counter 仅在 Python 2.7+ 中可用。这是 2.7 之前的一个实现:code.activestate.com/recipes/576611(或者可以只使用普通循环和 dict ;))
  • @Felix:在Counter之前,有defaultdict :)
【解决方案2】:

@SilentGhost 为 Python 2.7+ 提供了出色的解决方案。 2.6 及更早版本的相对简单的解决方案:

a = [8, 8, 1, 1, 5, 8, 9]

popularity = sorted(set(a), key=lambda x: -a.count(x))

[8, 1, 5, 9]

然而,这个解决方案很昂贵(因为count)。

这里是另一个更好的临时字典解决方案:

a = [8, 8, 1, 1, 5, 8, 9]
d = {}
for i in a:
    d[i] = d.get(i, 0) + 1
popularity = sorted(d, key=d.get, reverse=True)

【讨论】:

  • 这对于大型列表来说非常昂贵。
  • @SilentGhost - 你是对的。我用 dict 添加了一个更好的解决方案。
  • 我认为key=d.get 就足够了。
猜你喜欢
  • 1970-01-01
  • 2016-11-07
  • 2015-09-10
  • 2019-08-19
  • 2011-08-16
  • 2016-03-10
  • 1970-01-01
  • 2021-09-01
  • 2018-01-26
相关资源
最近更新 更多