请解释集的顺序

时间:2012-08-02 11:43:46

标签: python set

我发现了一些在Python中使用set的代码。我尝试用列表模拟它们,但是当pop()来自它们时我会得到不同的结果!

我打开了Ipython来测试这些东西是如何工作的,并发现了一些非常奇怪的东西:

In [16]: x
Out[16]: set([])

In [17]: x.add("a")

In [18]: x.add("b")

In [19]: x.add("c")

In [20]: x
Out[20]: set(['a', 'c', 'b'])

c之前不应该'b',因为它是在它之前添加的吗?我不明白这一点。

3 个答案:

答案 0 :(得分:15)

http://docs.python.org/library/stdtypes.html#set

  

作为无序集合,集合不记录元素位置或插入顺序。因此,集合不支持索引,切片或其他类似序列的行为。

集合的基础数据结构是哈希映射,有关here的大量信息。

答案 1 :(得分:7)

如果你看wikipedia's set entry,他们会说

  

抽象数据结构是数据的集合或聚合。数据可以是布尔值,数字,字符或其他数据结构。如果考虑通过打包[1]或索引[2]产生的结构,则有四种基本数据结构:[3] [4]

     

unpackaged,unindexed:束
  打包,无索引:设置
  unpackaged,indexed:string(sequence)
  打包,索引:列表(数组)

所以套装是无索引,或者没有以特定方式订购。

python文档同意这一点(总是检查文档,Python有一些我见过的最好的):

5.7. Set Types

  

set对象是不同的可哈希对象的无序集合。常见用途包括成员资格测试,从序列中删除重复项,以及计算数学运算,如交集,并集,差异和对称差异。 (对于其他容器,请参阅内置的dict,list和tuple类以及collections模块。)

答案 2 :(得分:1)

除了jamylakcrashmstr给出的好答案之外,您还可以通过示例自行查看。

>>> stringA="A"
>>> stringB="B"
>>> hash(stringA)
-269909568
>>> hash(stringB)
-141909181
>>> mySet = set()
>>> mySet.add(stringB)
>>> mySet.add(stringA)
>>> mySet
set(['A', 'B'])

所以我在“A”之前的集合中插入了“B”。为什么它显示“A”,“B”(当列表保持订单时?)。好吧,看一下为字符串“A”和“B”计算的哈希值。哪一个更小?如果你用字典做同样的事情会发生什么,其中键是那些哈希?:

>>> myDict = {-141909181: "B", -269909568: "A"}
>>> myDict
{-269909568: 'A', -141909181: 'B'}

也许这有助于理解这些集合。