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)
它在Python 2.7之前不可用
使用该语法无法表达空集(使用{}创建空字典)
那些对你来说可能重要也可能不重要.
这里概述了这种语法的文档部分.
Thr*_*ton 42
比较单词参数{}和set()单词参数之间的区别.
>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'}
>>> b = {'aardvark'}
>>> b
{'aardvark'}
Run Code Online (Sandbox Code Playgroud)
但两者a并b是一组当然.
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)
我很惊讶没有人提到这一点,但据我所知,这两种语法之间实际上存在差异\xe2\x80\x94,那就是性能/优化。
\n对于大多数情况,差异应该可以忽略不计,但在您的示例中,以下是set直接从项目创建:
my_set = {\'foo\', \'bar\', \'baz\'}\nRun Code Online (Sandbox Code Playgroud)\n虽然下面创建了 alist然后将其传递给set构造函数:
my_set = set([\'foo\', \'bar\', \'baz\'])\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n据我所知,{}文字语法是在构造set. 对我个人来说有点奇怪的是,set构造函数并没有被设计为采用可变数量的位置参数,如下所示:
\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\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,该签名不存在。
\n