-1

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

示例输入:

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

预期输出:

[
    ("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容器,或者至少我还没有找到,而且OrderedDictPython 3 中后来添加的容器似乎不接受自定义比较 lambda。

有谁知道一个简单的方法来做到这一点?

4

1 回答 1

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

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

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

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

于 2021-06-05T11:05:52.007 回答