dict和set之间的区别(python)

N. *_*uda 43 python dictionary set

所以,我知道这个,

a = {}  # dict
Run Code Online (Sandbox Code Playgroud)

构造一个空字典.现在,我也接受了这个,

b = {1, 2, 3}  # set
Run Code Online (Sandbox Code Playgroud)

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

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

>>>print(type(b))
<class 'set'>
Run Code Online (Sandbox Code Playgroud)

虽然我理解它的作用,但我不明白为什么我们为集合和字典使用相同的语法.我试图找到有关在这背后的逻辑更多信息,setdict本手册的部分,但遗憾的是,我什么都没出来.

任何人都可以向我解释为什么我们这样做?这是出于历史原因,还是我错过了一些明显的东西?

mya*_*aut 37

Python 2 中没有设置文字,历史上只用于字典的花括号.可以从列表(或任何迭代)生成集合:

set([1, 2, 3])
set([i for i in range(1, 3)])
Run Code Online (Sandbox Code Playgroud)

Python 3引入了集合文字和理解(参见PEP-3100),它允许避免使用中间列表:

{1, 2, 3}
{i for i in range(1, 3)}
Run Code Online (Sandbox Code Playgroud)

空集表单,但是为字典保留为向后兼容性.检查PEP-3100的参考资料,即:P3K中的[Python-3000]设置?

我确信我们可以解决问题 - 我同意,{}对于空集和{:} 空字典是理想的,如果不是为了向后兼容.当我第一次写PEP时,我喜欢"特殊的空对象"的想法(即,有些{}东西可以变成一个集合或字典)​​,但是这里的一位教师让我相信它只会导致新人混淆思想(以及实施的痛苦).

以下信息更好地描述这些规则:

我认为Guido有最好的解决方案.使用set()空套,使用{} 空类型的字典,使用{genexp}了一套推导/显示器,使用 {1,2,3}显式集文字,并使用{k1:v1, k2:v2}了字典文字.如果需求超过厌恶,我们总是可以添加{/更}晚.


Mar*_*ers 12

语法一样.字典首先使用花括号,并指定键值对,其中键和值由冒号分隔:

>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)

稍后将集添加到语言中,{..}大括号表示法仅指定元素,而不是对:

>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>
Run Code Online (Sandbox Code Playgroud)

请注意,在Python 2中,解释器使用set()callable 回显对象.这也是你如何指定一个集:

>>> emptyset = set()
Run Code Online (Sandbox Code Playgroud)

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

>>> {'foo'}
{'foo'}
>>> _ - {'foo'}  # difference, removing the one element
set()
Run Code Online (Sandbox Code Playgroud)

set()类型在2.4版本中添加到Python语言中(参见PEP 218),在Python 3添加了set literals的大括号语法,并反向移植到Python 2.7.


Mik*_*ler 7

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