Python 获取一个列表,按人气排序,然后删除重复项
可能重复:Python 获取一个列表,按人气排序,然后删除重复项,python,Python,可能重复: 大家好 我正在寻找一种简单的方法,按流行程度对列表进行排序,然后删除重复的元素 例如,给定一个列表: [8, 8, 1, 1, 5, 8, 9] 最后,我会列出如下清单: [8, 1, 5, 9] 请参阅文档以获取与旧版本兼容的实现的链接。@SilentGhost为Python 2.7+提供了一个优秀的解决方案。对于2.6及以上版本,一个相对简单的解决方案: a = [8, 8, 1, 1, 5, 8, 9] popularity = sorted(set(a), key=l
大家好 我正在寻找一种简单的方法,按流行程度对列表进行排序,然后删除重复的元素 例如,给定一个列表:
[8, 8, 1, 1, 5, 8, 9]
最后,我会列出如下清单:
[8, 1, 5, 9]
请参阅文档以获取与旧版本兼容的实现的链接。@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)
你应该举个更好的例子。在你的作品中,流行的顺序与数字的自然顺序相同。如果你有两个9,是不是
[1,3,9,5]
?是的。抱歉搞混了@卡姆:你不能按人气来给一个名单排序。您必须创建包含计数的其他中间结构。您还看过哪些其他结构?您应该提到,Counter
仅在Python 2.7+中可用。这是pre 2.7的一个实现:(或者可以只使用普通循环和dict;)@Felix:在计数器
之前,有defaultdict
:)这对于大型列表来说非常昂贵。@SilentGhost-你说得对。我用dict添加了一个更好的解决方案。我认为key=d.get
就足够了。
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)