Python 为什么在将列表转换为集合时集合是有序的?

Python 为什么在将列表转换为集合时集合是有序的?,python,list,set,Python,List,Set,我试图用Python编写一个函数来删除列表中的重复项 但在我这样做之后,我发现列表是通过将其转换为set并返回到列表来排序的 以下是脚本: >>> l = [9,10,10,11,1,1,1,22,2,2,2] >>> s = set(l) >>> s set([1, 2, 9, 10, 11, 22]) >>> l2 = list(s) >>> l2 [1, 2, 9, 10, 11, 22] >&

我试图用Python编写一个函数来删除列表中的重复项

但在我这样做之后,我发现列表是通过将其转换为set并返回到列表来排序的

以下是脚本:

>>> l = [9,10,10,11,1,1,1,22,2,2,2]
>>> s = set(l)
>>> s
set([1, 2, 9, 10, 11, 22])
>>> l2 = list(s)
>>> l2
[1, 2, 9, 10, 11, 22]
>>> l2 = list(set(l))
>>> l2
[1, 2, 9, 10, 11, 22]
>>> 
集合
s
已订购(至少在打印时订购)

为什么要订购这套

如果通过运行以下命令删除重复项,时间复杂度是多少:

def remove_duplicates(nums):
    return list(set(nums))

列表(set(data))
方法的运行时间为O(n)

该集合显示为整数散列方式的工件。使用其他输入时,数据将偏离排序顺序


要克服任意排序,请使用这个习惯用法,它也是O(n):
list(collections.OrderedDict.fromkeys(data))

简而言之:
set
对象是任意排序的。@TigerhawkT3请不要在关闭时太过激进。这个问题不仅仅是任意的集合排序。
set_l=[x表示枚举(l)中的(i,x),如果l.index(x)==i]
@TigerhawkT3这不是堆栈溢出问题指南。关于某事物如何工作的许多好问题都有该示例提出的合法子问题。@TigerhawkT3 OP似乎知道
set
的预期行为。问题不在于
set
是否已排序,而在于打印时为什么
set
似乎已排序。这个问题是相当合理和明智的。请在结束之前重新阅读问题,确保您理解问题。Gocha!你是对的。在我用一些非常大的数字测试之后,返回的列表没有排序。非常感谢。你的新方法是O(n logn)不是吗?@TimothyShields不是。比较次数为O(n)。这很容易通过插装进行验证。@RaymondHettinger,这难道不意味着您有一种基于确定性比较的方法,可以在O(n)时间内对n个不同数字的列表进行排序吗?这是不可能的。您的解决方案是O(n logn),除非我对OrderedDict的实现有误解。你的回答很好-我只是想澄清这一点,这样人们就不会被误导。@RaymondHettinger我现在明白你的意思了。:)。我把它和排序过的RB树混淆了,因为乍一看,这就是这个名字给我的启示。你的语气是不必要的。我说我想“澄清”。我说“除非我对实施有误解”。这意味着我不确定我在说什么,并邀请你以友好的语气描述我所误解的内容。下次试一试:“如果OrderedDict实际排序,这是正确的,但它没有。它只记得添加项目的顺序,并且仍然使用哈希表。”