微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:如何使用自定义比较器一次对项目进行排序并删除重复项?

如何解决Python:如何使用自定义比较器一次对项目进行排序并删除重复项?

我有一个元组列表,我需要按它们的第二个元素排序并删除重复项。

示例输入:

[
    ("1","b"),("2","e"),("3","d"),"c"),("4","a"),("5",]

预期输出

[
    ("5",("1",]

这个问题的常见答案是

myList = sorted( set(myList),key = lambda x: x[1] )

但这似乎不是最好的方法,因为首先从列表构造一个集合,然后从集合中构造回一个列表(具有随机不同的顺序),然​​后将排序算法应用于列表.

在其他可以更好地控制容器及其实现的语言中,我会使用有序集来做到这一点,因为该容器将删除重复项并同时对元素进行排序。我想写这样的东西。

myList = list( ordered_set( myList,key = lambda x: x[1] ) )

但在 Python 中,这似乎是一项矫枉过正的任务。 Python 中没有 ordered_set 容器,或者至少我没有找到,而且后来在 Python 3 中添加OrderedDict 似乎不接受自定义比较 lambdas。

有人知道一种简单的方法吗?

解决方法

您自己发布的解决方案似乎非常适合,但如果您真的想避免转换为集合,您当然可以这样做:

items = [(0,1),(1,0),(0,1)]
sorted((item for i,item in enumerate(items) if item not in items[:i]),key=lambda x: x[1])

请注意,它会比您已有的慢得多。另外,请注意,至少从 3.6 开始,集合的顺序是稳定的并且等于插入顺序,因此可以简单地创建有序集合,如下所示:

set(sorted(items,key=lambda x: x[1]))

如果你真的需要它是一个列表而不是一个集合,你可以转换回一个列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?