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'>
虽然我理解它的作用,但我看不出为什么我们对空字典使用“集合表示法”。我试图在手册的set
和dict
部分中找到有关其背后逻辑的更多信息,但遗憾的是,我什么也没得到。
谁能向我解释为什么我们会这样做?是因为历史原因,还是我遗漏了一些明显的东西?
【问题讨论】:
嗯,set
就像 dict
有键但没有值,它们都是使用哈希表实现的。但是,是的,
表示法表示空的dict
而不是空的set
有点烦人,但这是一个历史产物。我看到一个建议,:
应该 是空的 dict
和
是空的 set
,但我怀疑这将永远实现,因为它与太多的冲突现有代码。
@PM2Ring,谢谢!我肯定会支持这一点,因为我觉得目前的情况(除了语言定义,我猜这很清楚)读起来有点模棱两可。
FWIW,我很容易记住
是一个空的 dict
,因为 Python 一直都有 dict
s,因为它们是 Python 工作方式的基础:普通对象属性存储在dict
中,变量的行为就好像它们是dict
中的名称:值对(尽管出于效率原因,它们不一定以这种方式实现)。而set
s 不久之后被添加到该语言中。 (当然,在那之前,总是可以通过使用带有虚拟值的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的区别和用法