【问题标题】:Python: How to sort items and remove duplicates in one pass using custom comparator?Python:如何使用自定义比较器一次性对项目进行排序并删除重复项?
【发布时间】:2021-08-23 04:20:21
【问题描述】:

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

示例输入:

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

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

【问题讨论】:

  • 请始终分享输入示例和预期输出,以便我们正确理解问题
  • @azro 示例添加

标签: python set ordereddict


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2013-12-03
    • 2012-09-20
    • 1970-01-01
    • 2016-03-12
    • 2013-06-28
    • 2020-07-11
    相关资源
    最近更新 更多