Python 为什么有时可以将set()替换为{}?
在PyCharm中,当我写道:Python 为什么有时可以将set()替换为{}?,python,set,Python,Set,在PyCharm中,当我写道: return set([(sy + ady, sx + adx)]) 它说“函数调用可以替换为set literal”,因此它将其替换为: return {(sy + ady, sx + adx)} 为什么呢?Python中的set()不同于字典{} 如果它想对此进行优化,为什么会更有效?这是set()的另一种语法 dict语法不同。它由键值对组成。例如: my_obj = {1:None, 2:None} Python集和字典都可以使用大括号构造: my_
return set([(sy + ady, sx + adx)])
它说“函数调用可以替换为set literal”,因此它将其替换为:
return {(sy + ady, sx + adx)}
为什么呢?Python中的set()
不同于字典{}
如果它想对此进行优化,为什么会更有效?这是
set()的另一种语法
dict
语法不同。它由键值对组成。例如:
my_obj = {1:None, 2:None}
Python集和字典都可以使用大括号构造:
my_dict={'a':1,'b':2}
my_set={1,2,3}
口译员(和人类读者)可以根据内容区分它们。但是,无法区分空集合和空dict,因此在这种情况下,您需要使用set()
来消除空集合的歧义
一个非常简单的测试表明文字构造更快(python3.5):
介绍了一些关于文字结构在内置函数上的性能问题,尽管是针对列表和dict。总结似乎是文字构造需要较少的解释器工作。set([iterable])
是从可选iterableiterable
创建集合的构造函数。{}
是创建set/dict对象文本。因此,创建什么取决于您如何使用它
In [414]: x = {}
In [415]: type(x)
Out[415]: dict
In [416]: x = {1}
In [417]: type(x)
Out[417]: set
In [418]: x = {1: "hello"}
In [419]: type(x)
Out[419]: dict
另一个例子是set
和{}
如何不可互换(如Jornsharpe所述):
请注意,尽管有标题,但不能将set()
替换为{}
,但可以将非空的集((1,2,3))
替换为文本{1,2,3}
,因为现在很明显,这不是字典。请看,文字结构可能更快,因为您没有构建中间列表;如果你把这个因素考虑进去会怎么样?@jornsharpe似乎还是比较慢:timeit.timeit(stmt='a=set(mylist)'setup='mylist=[1,2,3]')->0.3987466390244663
-我想我添加的链接涵盖了其中的一些。哇,在Python3.8中,尝试你的测试,差异是令人印象深刻的:0.1970
vs0.0705
set(f)的功能带有文本的
必须使用解包:{*f}
。永远不可能将集合(sometuff)
替换为{sometuff}
。但是只要源代码中的sometuff
不是0个字符,就可以用{sometuff}
替换set([sometuff])
。由于OP使用的是set([somestuff])
,而somestuff
不是0个字符,因此可以进行替换。当您说set([iterable])
时,您是指出现的是文字字符[
和]
?或者您是否使用ABNF表示iterable
是函数set()
的可选参数?因为第一种情况是错误的,第二种情况是正确的。这很令人困惑,因为很多人会读到这篇文章,认为你指的是第一个案例。
>>> timeit.timeit('a = set([1, 2, 3])')
0.5449375328607857
>>> timeit.timeit('a = {1, 2, 3}')
0.20525191631168127
In [414]: x = {}
In [415]: type(x)
Out[415]: dict
In [416]: x = {1}
In [417]: type(x)
Out[417]: set
In [418]: x = {1: "hello"}
In [419]: type(x)
Out[419]: dict
In: f = 'FH'
In: set(f)
Out: {'F', 'H'}
In: {f}
Out: {'FH'}