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

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

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

这样做有没有什么缺点,与标准的方法相反:

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

还是只是风格的问题?

141638 次浏览

Set 文字语法有两个明显的问题:

my_set = {'foo', 'bar', 'baz'}
  1. 在 Python 2.7之前是不可用的

  2. 没有办法使用这种语法来表达一个空集(使用 {}创建一个空结果)

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

概述此语法的文档部分是 给你

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

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

在 python 2.7中:

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

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

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

还可以使用全面的语法来初始化集合:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

再比较一下 {}set()在单词参数上的区别。

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

但是 ab当然都是集合。

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

我很惊讶没有人提到这一点,但从我所知道的来看,这两种语法之间似乎确实存在差异ーー那就是 性能/优化

在大多数情况下,这种差异应该是可以忽略不计的,但是在您的示例中,下面是直接从项目创建 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")


# You would then construct a `set` from an existing
# `list` by simply unpacking the sequence.
>>> set(*["foo", "bar", "baz"])

不幸的是,这个签名并不存在。