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

0 人关注

我有一个图元的列表,我需要按其第二元素进行排序,并删除重复的内容。

输入的例子。

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

expected output:

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

这个问题的常见答案是

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。

有谁知道有什么简单的方法可以做到这一点?

2 个评论
azro
请经常分享输入实例和预期输出,以便我们正确理解问题。
@azro 示例添加
python
set
ordereddict
Youda008
Youda008
发布于 2021-06-05
1 个回答
hugovdberg
hugovdberg
发布于 2021-06-05
已采纳
0 人赞同

你自己发布的解决方案似乎完全没有问题,但如果你真的想避免转换为一套,你当然可以这样做。

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])