我正在尝试获取一个list
(下面的orig_list
),并返回一个list
(new_list
下面)其中:
- 不包含重复项(即仅包含唯一元素)
- 倒序排列
这是我目前所知道的,这似乎...我要说“奇怪”,但我确信有更好的表达方式。我对两次使用 list()
感到很反感,因为这看起来非常简单,然后我想知道这种方法的效率。
new_list = list(reversed(sorted(list(set(orig_list)))))
问题 #1(SO 风格的问题):
下列命题正确吗?
- 没有比将
list
转换为set
并返回更有效的方法来获取list
的唯一元素。 - 自 sets are unordered in Python必须 (1) 在删除重复项之前转换为集合,否则无论如何都会丢失排序,并且 (2) 在排序之前必须转换回列表。
- 使用 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
正在添加一个额外的操作,如果您排序到正确的则不需要从头开始订购。
关于python - 从列表中删除重复项并按相反顺序排序的最佳/最pythonic方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52885743/