sep*_*p2k 472
不,空集没有文字语法.你必须写set()
.
Rei*_*hin 46
只是为了扩展接受的答案:
从版本2.7
和3.1
python有使用形式的set
文字,但它本身仍然用于空dict.{}
{1,2,3}
{}
Python 2.7(第一行在Python <2.7中无效)
>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)
Python 3.x
>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)
更多信息:https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
Jim*_*ard 41
无论如何,请使用 set()
创建一个空集.
但是,如果你想给人留下深刻印象,告诉他们你可以使用文字和*
Python> = 3.5 创建一个空集(参见PEP 448):
>>> s = {*()} # or {*{}} or {*[]}
>>> print(s)
set()
Run Code Online (Sandbox Code Playgroud)
这基本上是一种更为浓缩的做法{_ for _ in ()}
,但是,不要这样做.
是的。适用于非空 dict/set 的相同符号也适用于空的。
请注意非空dict
和set
文字之间的区别:
{1: 'a', 2: 'b', 3: 'c'}
-- 内部的一些键值对组成一个dict
{'aaa', 'bbb', 'ccc'}
--内部的一组值组成一个set
所以:
{}
== 零个键值对 == 空dict
{*()}
== 空的值元组 == 空set
然而,你可以做到这一点并不意味着你应该这样做。除非您有充分的理由,否则最好显式构造一个空集,例如:
a = set()
Run Code Online (Sandbox Code Playgroud)
表现:
的文字是〜15%的速度比设定-constructor(CPython的-3.8,2019 PC,英特尔(R)核心(TM)i7-8550U CPU @ 1.80GHz):
Run Code Online (Sandbox Code Playgroud)>>> %timeit ({*()} & {*()}) | {*()} 214 ns ± 1.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) >>> %timeit (set() & set()) | set() 252 ns ± 0.566 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
...为了完整起见 ,Renato Garcia对上述表达式的
frozenset
建议快了60%!Run Code Online (Sandbox Code Playgroud)>>> ? = frozenset() >>> %timeit (? & ?) | ? 100 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
注:由于ctrueden注意到意见,{()}
是不是一个空集。这是一个包含 1 个元素的集合:空元组。
这取决于您是希望文字进行比较还是分配.
如果要将现有集设置为空,则可以使用.clear()
metod,尤其是在您要避免创建新对象时.如果要进行比较,请使用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
Run Code Online (Sandbox Code Playgroud)