dict和set之间的区别(python)

Posted

技术标签:

【中文标题】dict和set之间的区别(python)【英文标题】:Difference between dict and set (python) 【发布时间】:2016-03-26 01:07:43 【问题描述】:

所以,我知道这个,

a =   # dict

构造一个空字典。现在,我也捡到了这个,

b = 1, 2, 3  # set

创建一个集合。这很容易验证,因为,

>>>print(type(a))
<class 'dict'>

>>>print(type(b))
<class 'set'>

虽然我理解它的作用,但我看不出为什么我们对空字典使用“集合表示法”。我试图在手册的setdict 部分中找到有关其背后逻辑的更多信息,但遗憾的是,我什么也没得到。

谁能向我解释为什么我们会这样做?是因为历史原因,还是我遗漏了一些明显的东西?

【问题讨论】:

嗯,set 就像 dict 有键但没有值,它们都是使用哈希表实现的。但是,是的, 表示法表示空的dict 而不是空的set 有点烦人,但这是一个历史产物。我看到一个建议,: 应该 是空的 dict 是空的 set,但我怀疑这将永远实现,因为它与太多的冲突现有代码。 @PM2Ring,谢谢!我肯定会支持这一点,因为我觉得目前的情况(除了语言定义,我猜这很清楚)读起来有点模棱两可。 FWIW,我很容易记住 是一个空的 dict,因为 Python 一直都有 dicts,因为它们是 Python 工作方式的基础:普通对象属性存储在dict 中,变量的行为就好像它们是dict 中的名称:值对(尽管出于效率原因,它们不一定以这种方式实现)。而sets 不久之后被添加到该语言中。 (当然,在那之前,总是可以通过使用带有虚拟值的dict 来“伪造”一个集合)。 【参考方案1】:

Python 2 中没有 set literals,历史上花括号仅用于字典。集合可以从列表(或任何可迭代对象)中产生:

set([1, 2, 3])
set([i for i in range(1, 3)])

Python 3 引入了集合字面量和推导式(参见 PEP-3100),这使我们能够避免中间列表:

1, 2, 3
i for i in range(1, 3)

然而,由于向后兼容,空集形式被保留给字典使用。来自[Python-3000] sets in P3K? 的引用声明:

我确信我们可以解决问题 --- 我同意, 用于空集,: 如果不是为了向后兼容,空 dict 将是理想的。一世 当我第一次编写 PEP 时喜欢“特殊的空对象”的想法(即, 有 可以变成一个集合或字典)​​,但是一个 这里的教官说服我,这只会导致混乱 在新人的心目中(以及实施起来很痛苦)。

following message 更好地描述了这些规则:

我认为 Guido 有最好的解决方案。对空集使用set(),使用 对于空字典,使用genexp 设置理解/显示,使用 1,2,3 用于显式设置文字,并使用 k1:v1, k2:v2 用于 dict 文字。如果需求超过反感,我们可以随时添加/

【讨论】:

虽然发布的所有答案都非常有帮助,但我个人认为这个答案最能回答我的问题。感谢您对那个 PEP 的引用,我自己还没有找到它。 在 Py2.7 中确实可用:docs.python.org/3/whatsnew/2.7.html#python-3-1-features【参考方案2】:

用于空字典而不是空集这一事实在很大程度上具有历史原因。字典的语法 'a': 100, 'b': 200 从 Python 开始就已经存在。 Python 2.7 引入了集合的语法 1, 2, 3。由于 已经使用了很长时间,它将一直作为定义空字典的方式。如果 Python 从一开始就有新的集合语法,那么很可能会用 定义一个空集,用: 定义一个空字典。

【讨论】:

【参考方案3】:

语法相同。字典首先使用花括号,然后您指定 key-value 对,其中键和值用冒号分隔:

>>> 'foo': 'bar'
'foo': 'bar'
>>> type(_)
<type 'dict'>

集合后来被添加到语言中,.. 花括号符号只命名元素,而不是对:

>>> 'foo'
set(['foo'])
>>> type(_)
<type 'set'>

请注意,在 Python 2 中,解释器使用 set() 可调用对象回显对象。这也是您指定 empty 集的方式:

>>> emptyset = set()

在 Python 3 中,回显对象时使用较新的 .. 表示法,除非它为空:

>>> 'foo'
'foo'
>>> _ - 'foo'  # difference, removing the one element
set()

set() 类型已添加到 Python 语言中的 version 2.4(请参阅 PEP 218),集合文字的花括号语法为 added in Python 3 和 back-ported to Python 2.7。

【讨论】:

以上是关于dict和set之间的区别(python)的主要内容,如果未能解决你的问题,请参考以下文章

Python set list dict tuple 区别和相互转换

Python中内置数据类型list,tuple,dict,set的区别和用法

Python中内置数据类型list,tuple,dict,set的区别和用法

Python中list,tuple,dict,set的区别和用法

Python中内置数据类型list,tuple,dict,set的区别和用法

Python中内置数据类型list,tuple,dict,set的区别和用法