Skip to main content
 首页 » 编程设计

python之从列表中删除重复项并按相反顺序排序的最佳/最pythonic方法

2025年05月04日20Renyi-Fan

我正在尝试获取一个list(下面的orig_list),并返回一个list(new_list下面)其中:

  • 不包含重复项(即仅包含唯一元素)
  • 倒序排列

这是我目前所知道的,这似乎...我要说“奇怪”,但我确信有更好的表达方式。我对两次使用 list() 感到很反感,因为这看起来非常简单,然后我想知道这种方法的效率。

new_list = list(reversed(sorted(list(set(orig_list)))))

问题 #1(SO 风格的问题):

下列命题正确吗?

  1. 没有比将 list 转换为 set 并返回更有效的方法来获取 list 的唯一元素。
  2. 自 sets are unordered in Python必须 (1) 在删除重复项之前转换为集合,否则无论如何都会丢失排序,并且 (2) 在排序之前必须转换回列表。
  3. 使用 list(reversed()) 在编程上等同于使用 list.sort(reversed=True)。

问题 #2(奖金):

有没有什么方法可以用更少的 O 或使用更简洁的方法来达到相同的结果?如果是这样,什么是/有一些例子吗?

请您参考如下方法:

sorted(set(orig_list), reverse=True) 

代码最短,效率更高,结果相同。

根据大小,如 user2864740 在评论中建议的那样,先排序然后在线性时间内进行重复数据删除可能会或可能不会更快。 (该方法的最大缺点是它将完全在 Python 中,而上面的行主要在 native 代码中执行。)

您的问题:

  • 您不需要在集合和列表之间来回转换。 sorted 接受任何可迭代对象,因此 set 符合条件并吐出一个列表,因此不需要进行后转换。

  • reversed(sorted(x)) 不等同于sorted(x, reverse=True)。您会得到相同的结果,但速度较慢 - sort 无论是正向还是反向都具有相同的速度,因此 reversed 正在添加一个额外的操作,如果您排序到正确的则不需要从头开始订购。