如何解决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 举报,一经查实,本站将立刻删除。