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

fvr*_*ghl 87 python set python-2.7

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

my_set = {'foo', 'bar', 'baz'}
Run Code Online (Sandbox Code Playgroud)

这样做是否有任何缺点,而不是标准方式:

my_set = set(['foo', 'bar', 'baz'])
Run Code Online (Sandbox Code Playgroud)

还是只是一个风格问题?

bgp*_*ter 87

set字面语法有两个明显的问题:

my_set = {'foo', 'bar', 'baz'}
Run Code Online (Sandbox Code Playgroud)
  1. 它在Python 2.7之前不可用

  2. 使用该语法无法表达空集(使用{}创建空字典)

那些对你来说可能重要也可能不重要.

这里概述了这种语法的文档部分.


Thr*_*ton 42

比较单词参数{}set()单词参数之间的区别.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}
Run Code Online (Sandbox Code Playgroud)

但两者ab是一组当然.

  • 这就是为什么我喜欢将自己的构造函数提升为`set([])`而不仅仅是`set()`. (3认同)
  • set()始终采用单个参数。一个可迭代的。 (3认同)
  • @GeorgeKettleborough 单个*或没有*参数,后者创建一个空集。 (2认同)

0x9*_*x90 26

Python 3文档(同样适用于python 2.7):

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

在python 2.7中:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])
Run Code Online (Sandbox Code Playgroud)

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

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 
Run Code Online (Sandbox Code Playgroud)

也可以使用综合语法来初始化集合:

>>> 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', '{', '}'])
Run Code Online (Sandbox Code Playgroud)


Arj*_*jun 8

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


Aar*_*oin 5

我很惊讶没有人提到这一点,但据我所知,这两种语法之间实际上存在差异\xe2\x80\x94,那就是性能/优化

\n

对于大多数情况,差异应该可以忽略不计,但在您的示例中,以下是set直接从项目创建:

\n
my_set = {\'foo\', \'bar\', \'baz\'}\n
Run Code Online (Sandbox Code Playgroud)\n

虽然下面创建了 alist然后将其传递给set构造函数:

\n
my_set = set([\'foo\', \'bar\', \'baz\'])\n
Run Code Online (Sandbox Code Playgroud)\n

最终结果是相同的,但我们得到它们的方式略有不同。正如您所期望的,第二个有点慢:

\n
\xe2\x9d\xaf python -m timeit \'my_set = {"foo", "bar", "baz"}\'\n10000000 loops, best of 5: 37.3 nsec per loop\n\n\xe2\x9d\xaf python -m timeit \'my_set = set(["foo", "bar", "baz"])\'\n5000000 loops, best of 5: 92.3 nsec per loop\n
Run Code Online (Sandbox Code Playgroud)\n

据我所知,{}文字语法是在构造set. 对我个人来说有点奇怪的是,set构造函数并没有被设计为采用可变数量的位置参数,如下所示:

\n
\xe2\x9d\xaf python -m timeit \'my_set = {"foo", "bar", "baz"}\'\n10000000 loops, best of 5: 37.3 nsec per loop\n\n\xe2\x9d\xaf python -m timeit \'my_set = set(["foo", "bar", "baz"])\'\n5000000 loops, best of 5: 92.3 nsec per loop\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,该签名不存在。

\n