-1

我发现了一些set在 Python 中使用 s 的代码。我试图用列表来模拟它们,但是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'])

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

4

3 回答 3

15

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

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

一个集合的底层数据结构是一个哈希映射,这里有很多关于这些的信息。

于 2012-08-02T11:45:49.750 回答
7

如果您查看维基百科的设置条目,他们会说

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

未打包,未索引:捆绑
打包,未索引:设置
未打包,索引:字符串(序列)
打包,索引:列表(数组)

所以集合是未索引的,或者没有以特定方式排序。

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

5.7. 设置类型

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

于 2012-08-02T11:50:49.270 回答
1

除了jamylakcrashmstr给你的好答案,你可以通过一个例子自己看。

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

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

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

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

于 2012-08-02T15:53:48.290 回答