在Python中使用大括号来初始化一个Set

133 人关注

我正在学习python,我有一个关于初始化集合的新手问题。 通过测试,我发现一个集合可以这样初始化。

my_set = {'foo', 'bar', 'baz'}

相对于标准的方式,这样做有什么缺点吗?

my_set = set(['foo', 'bar', 'baz'])

还是说这只是一个风格问题?

5 个评论
文档中确实提到了它,只是不在那里。请注意,那是一个被废弃的模块的文档,即 真正的 集现在是内建的。它在 "What's New in Python 2.7" 文档中,语言参考文献也简要地描述了它。 docs.python.org/2/reference/expressions.html#set-displays
@delnan 我使用的是Python 2.7,所以我没有想到要去看Python 3的文档。 我发布的链接是针对2.7的,但很奇怪的是,它并没有提到这个。
我后来编辑了我的评论,2.7版的文档也提到了这一点。你发布的链接已经过时了,是过去的遗物,是错误的,被废弃的。忘记它的存在,使用它自己告诉你的东西来代替。 docs.python.org/2/library/stdtypes.html#set docs.python.org/2/library/stdtypes.html#frozenset
@delnan 谢谢你帮助我。 我编辑了这个问题,不再说没有相关的文档(尽管网上有很少的例子提到这个)。
对于路过的人来说。Pycharm警告说,在可以使用字面意义的情况下,不要使用函数调用--可能有性能方面的原因--所以在新代码中更倾向于使用设置字面意义的方式。
python
python-2.7
set
fvrghl
fvrghl
发布于 2013-06-29
5 个回答
bgporter
bgporter
发布于 2022-07-06
已采纳
0 人赞同

集合字词的语法有两个明显的问题。

my_set = {'foo', 'bar', 'baz'}
  • 在Python 2.7之前,它是不可用的。

  • 没有办法用这种语法来表达一个空集(使用{}会产生一个空的dict)。

  • 这些对你来说可能重要,也可能不重要。

    文档中概述这种语法的部分是here.

    Thruston
    Thruston
    发布于 2022-07-06
    0 人赞同

    再比较一下 {} set() 之间的区别,用单字论证。

    >>> a = set('aardvark')
    {'d', 'v', 'a', 'r', 'k'} 
    >>> b = {'aardvark'}
    {'aardvark'}
    

    ab都是当然的集合。

    这就是为什么我喜欢提醒自己集合构造函数为 set([]) 而不仅仅是 set()
    替换代码0】总是取一个参数。一个单一的可迭代变量。
    @GeorgeKettleborough一单 or no 参数,后者是为了创建一个空集。
    0x90
    0x90
    发布于 2022-07-06
    0 人赞同

    From Python 3 文档 ( 对Python 2.7也是如此 ):

    可以用大括号或set()函数来创建集合。注意。 要创建一个空集,你必须使用 set() ,而不是 {} ;后者 创建一个空的字典,这是一个数据结构,我们将在下一节讨论。 我们在下一节中讨论。

    in python 2.7:

    >>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
    >>> my_set
    set(['bar', 'foo', 'baz'])
    

    请注意,{}也用于map/dict

    >>> m = {'a':2,3:'d'}
    >>> type(m)
    <type 'dict'> 
    

    我们也可以使用综合语法来初始化集合。

    >>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
    set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])
        
    Arjjun
    Arjjun
    发布于 2022-07-06
    0 人赞同

    你需要做 empty_set = set() 来初始化一个空集。 {} 是一个空的 dict

    Aaron Beaudoin
    Aaron Beaudoin
    发布于 2022-07-06
    0 人赞同

    我很惊讶没有人提到这一点,但据我所知,这两种语法之间实际上是有区别的,那就是 性能/优化 .

    对于大多数情况来说,区别应该是可以忽略不计的,但在你的例子中,下面是直接从项目中创建一个 set

    my_set = {'foo', 'bar', 'baz'}
    

    而下面创建一个list,然后将其传递给set构造函数。

    my_set = set(['foo', 'bar', 'baz'])
    

    最终的结果是相等的,但我们得到它们的两种方式略有不同。正如你所期望的那样,第二种方式要慢一些。

    ❯ python -m timeit 'my_set = {"foo", "bar", "baz"}'
    10000000 loops, best of 5: 37.3 nsec per loop
    ❯ python -m timeit 'my_set = set(["foo", "bar", "baz"])'
    5000000 loops, best of 5: 92.3 nsec per loop
    

    据我所知,{}的字面语法是构建set时跳过创建中间迭代器的唯一方法。对我个人来说,set构造函数没有被设计成像这样接受可变数量的位置参数,这一点有点奇怪。

    # This usage is invalid in real Python. If it existed,
    # I would expect the call to be exactly equivalent
    # to the performance of the literal syntax.
    >>> set("foo", "bar", "baz")