【问题标题】:Difference between dict and set (python)dict和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 来“伪造”一个集合)。

标签: python dictionary set


【解决方案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 文字。如果需求超过反感,我们可以随时添加{/}

【讨论】:

【解决方案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 3back-ported to Python 2.7

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2011-02-14
      • 2017-01-22
      • 2016-03-02
      • 2016-09-02
      • 2016-12-17
      相关资源
      最近更新 更多