[]
= 空 list
()
= 空 tuple
{}
= 空 dict
那么空的 set
有类似的符号表示吗?还是必须写成 set()
?
没有专门表示空集合的文字语法。你需要写成 set()
。
毫无疑问,请使用set()
来创建一个空集合。
但是,如果你想给人留下印象,告诉他们你可以使用Python >= 3.5的字面量和*
来创建一个空集合(参见PEP 448),可以这样做:
>>> s = {*()} # or {*{}} or {*[]}
>>> print(s)
set()
这基本上是一种更简洁的做法{_ for _ in ()}
,但是,请不要这样做。
$ python3.7 -m timeit 'set()' 2000000 次循环, 最好的 5 次: 177 纳秒每个循环 $ python3.7 -m timeit '{*()}' 2000000 次循环, 最好的 5 次: 171 纳秒每个循环
- ogurets仅为扩展已接受的答案:
从版本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,2,3}.__class__
<class 'set'>
>>> {}.__class__
<class 'dict'>
更多信息请查看:https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
{}.__class__
仍将返回dict
。 - Ninja420{}.__class__
返回的是<class 'dict'>
而不是<type 'dict'>
。 - Tsonglewa = set()
注意:正如ctrueden在评论中指出的那样,{()}不是一个空集合。它是一个只有一个元素的集合:空元组。Performance:
The literal is ~15% faster than the set-constructor (CPython-3.8, 2019 PC, Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz):
>>> %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)
... and for completeness, Renato Garcia's
frozenset
proposal on the above expression is some 60% faster!
>>> ϕ = frozenset() >>> %timeit (ϕ & ϕ) | ϕ 100 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
{()}
不是空集合。它是一个只有一个元素的单例集合,该元素为一个空元组。你可以通过检查 len({()})
(结果应为1)或 () in {()}
(结果应为 True
)来验证这一点。 - ctrueden{()}
不是空集的注释,以防其他人犯同样的错误。谢谢你,@ctrueden! - pycoder这取决于您是想用于比较还是用于赋值。
如果您想使现有的集合为空,可以使用.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()
并不会清空set,而是创建一个新的set并将其赋值给a
,覆盖先前的任何值。 - gerrita.clear()
方法比 a=set()
稍微快一些,而检查 len(a)==0
比检查等于 a==set()
稍微快一些。 - Brian Mintonif len(a)==0:
,写成if a:
即可(更符合Python语言风格)。需要注意的是,如果你需要匹配条件的极性,则应该写成if not a:
。 - Jim Oldfield除了疯狂的想法之外:由于Python 3接受unicode标识符,因此您可以声明一个变量ϕ = frozenset()
(ϕ是U+03D5),并使用它代替其他变量。
set
对象是可变的,所以使用 spam = ϕ; spam.add("eggs")
会让你处于风险之中。 - drdaemanϕ
是一个冻结集合,那么尝试执行spam.add("eggs")
操作将会失败,因为冻结集合对象没有任何add
方法。 - Brian Mintonspan = ϕ
时,span
和ϕ
将指向同一对象,即id(span)== id(ϕ)
。因此,如果spam.add(“eggs”)
可以工作,那么ϕ
对象将不再是一个空集,我们将回到drdaeman指出的原始问题 - Renato Garcia- Brian Mintona['foo']='bar' a {'foo': 'bar'} `
вҲ…
е‘ўпјҹиҜ·зҝ»иҜ‘жӯӨеҸҘгҖӮ - ankostis在Python中有几种创建空集合的方法:
所以,这是两种创建空集合的方法。
map(lambda x: x)
只是为了展示它的工作原理。这也不是一个集合字面值,而只是一个集合推导式。 - user395760{0}-{0}
,虽然不如set()
显式,但它有一个好处,看起来像一双有趣的眼睛。 - wim{}
是一个字典。{0}
是一个集合。{0} - {0}
表示一个集合减去它自己,也就是空集合。 - michaelsnowdenf{a}'
要比str(a)
快。{*''}
的问题仅仅是速度上的收益并没有真正值得暂时混淆读你代码的所有人(如果你没有使用pypy,微小的优化在Python中几乎从来不重要)。 - user4698348