[]
=空 list
()
=空 tuple
{}
=空 dict
空有类似的记号set
吗?还是我必须写set()
?
{0}-{0}
。它不如清晰set()
,但确实具有看起来像一双有趣的眼睛的优点。
{}
是一本字典。{0}
是一套。{0} - {0}
是集合与它本身(空集合)之间的差异。
[]
=空 list
()
=空 tuple
{}
=空 dict
空有类似的记号set
吗?还是我必须写set()
?
{0}-{0}
。它不如清晰set()
,但确实具有看起来像一双有趣的眼睛的优点。
{}
是一本字典。{0}
是一套。{0} - {0}
是集合与它本身(空集合)之间的差异。
Answers:
不,空集没有文字语法。你必须写set()
。
一定请使用 set()
创建一个空集。
但是,如果您想打动别人,请告诉他们您可以使用文字和*
Python> = 3.5(请参阅PEP 448)创建一个空集,方法是:
>>> s = {*()} # or {*{}} or {*[]}
>>> print(s)
set()
这基本上是一种更简洁的方法{_ for _ in ()}
,但是,请不要这样做。
$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
set()
对于代码维护者而言,可能更容易理解,而且通常比性能更重要。{*()}
在几乎贬义的意义上似乎“聪明”。
只是为了扩展公认的答案:
从version 2.7
和3.1
python起,set
文字已经{}
以用法的形式出现了{1,2,3}
,但是{}
它本身仍然用于空字典。
Python 2.7(第一行在Python <2.7中无效)
>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>
Python 3.x
>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>
此处更多内容:https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
{}.__class__
仍然会给dict
{}.__class__
返回的<class 'dict'>'
是pyt3.6,而不是<type 'dict'>
这取决于您是否要使用文字进行比较或赋值。
如果要将现有集设为空,则可以使用该.clear()
方法,尤其是在要避免创建新对象的情况下。如果要进行比较,请使用set()
或检查长度是否为0。
例:
#create a new set
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}
#create an empty set
a=set()
#or, use the clear method
a.clear()
#comparison to a new blank set
if a==set():
#do something
#length-checking comparison
if len(a)==0:
#do something
a=set()
不会清空集合,而是创建一个新集合并将其分配给,从而a
覆盖任何先前的值。
a.clear()
比使用方法要快一些a=set()
,并且检查len(a)==0
要比对等检查要快一些a==set()
if len(a)==0:
是仅写if a:
(编辑:或更确切地说,if not a:
匹配条件的极性)就足够了(并且更加Pythonic )。
更加疯狂的想法是:在Python 3接受Unicode标识符的情况下,您可以声明一个变量ϕ = frozenset()
(ϕ为U + 03D5)并使用它。
set
对象是易变的,因此使用会使您面临风险spam = ϕ; spam.add("eggs")
。
ϕ
为Frozenset,则spam.add("eggs")
失败,因为Frozenset对象没有任何add
方法。
span = ϕ
两者span
并ϕ
指向同一对象时,即id(span) == id(ϕ)
。因此,如果spam.add("eggs")
可行,则该ϕ
对象将不再是空集,我们将回到原来的问题,正如drdaeman所指出的那样
>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
是。适用于非空dict / set的相同表示法适用于空dict / set。
注意非空dict
和set
文字之间的区别:
{1: 'a', 2: 'b', 3: 'c'}
-一个数字键-值对的内部使得dict
{'aaa', 'bbb', 'ccc'}
-一个元组值的内部使一个set
所以:
{}
==零个键值对==空dict
{*()}
==空值元组==空set
但是事实是您可以做到,但这并不意味着您应该这样做。除非您有很强的理由,否则最好显式构造一个空集,例如:
a = set()
注意:正如评论中注意到的那样,{()}
它不是一个空集合。这是一个包含1个元素的集合:空元组。
{()}
不是空集。它是一个具有一个元素的单例集:一个空的元组。您可以通过检查验证这一点len({()})
,这将是1,或者() in {()}
,这将是True
。
{()}
不是空集的说明,以防其他人犯同样的错误。谢谢@ctrueden!