空集文字?

Joh*_*åde 421 python set literals

[] =空 list

() =空 tuple

{} =空 dict

空的是否有类似的符号set?或者我必须写set()

sep*_*p2k 472

不,空集没有文字语法.你必须写set().

  • 实际上,set literals已被反向移植到Python 2.7,因此它们不仅严格地在Python 3中提供. (43认同)
  • 有设置文字,但仅限于Python 3.x. 无论如何都没有空集的文字. (15认同)
  • @andy这不是一个空集 - 这是一个包含数字1的集合.顺便说一下,你不需要尾随逗号 - 这只是元组所需要的. (12认同)
  • @ user763305:关于这一点,语言手册非常清楚.http://docs.python.org/library/stdtypes.html#set-types-set-frozenset说"非空集......可以通过在括号内放置以逗号分隔的元素列表来创建" (2认同)

Rei*_*hin 46

只是为了扩展接受的答案:

从版本2.73.1python有使用形式的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

  • 这个答案是对的.仍然没有文字语法来表示空集.`{} .__ class__`仍会给'dict` (11认同)
  • @Ninja420尝试在评论前先阅读,我注意到了 (7认同)
  • 实际上, `{}.__class__` 使用 pyt3.6 返回 `&lt;class 'dict'&gt;'`,而不是 `&lt;type 'dict'&gt;` (4认同)
  • 接受的答案仍然是正确的,并没有过时.*空集*没有文字语法,但是有一个空字典. (3认同)
  • @AndreasBjørn表示空的是,但是对于非空的,您将获得PEP8异常并建议使用set literal. (2认同)

Jim*_*ard 41

无论如何,请使用 set()创建一个空集.

但是,如果你想给人留下深刻印象,告诉他们你可以使用文字和*Python> = 3.5 创建一个空集(参见PEP 448):

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()
Run Code Online (Sandbox Code Playgroud)

这基本上是一种更为浓缩的做法{_ for _ in ()},但是,不要这样做.

  • @ogurets,“ set()”可能更容易理解(对于代码维护者而言),而这通常比性能更重要。在几乎贬义的意义上,“ {*()}”似乎“聪明”。 (5认同)
  • 你说如果你想给人们留下深刻印象? (3认同)
  • 呵呵,真聪明。 (2认同)

pyc*_*der 8

是的。适用于非空 dict/set 的相同符号也适用于空的。

请注意非空dictset文字之间的区别:

{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):

>>> %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)
Run Code Online (Sandbox Code Playgroud)

...为了完整起见Renato Garcia对上述表达式frozenset建议60%

>>> ? = frozenset()

>>> %timeit (? & ?) | ?
100 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Run Code Online (Sandbox Code Playgroud)

:由于ctrueden注意到意见,{()}不是一个空集。这是一个包含 1 个元素的集合:空元组。

  • `{()}` 不是空集。它是一个只有一个元素的单例集合:一个空元组。您可以通过检查 `len({()})` 来验证这一点,这将是 1,或者检查 `() in {()}`,这将是 `True`。 (2认同)
  • 哎呀,你说得对!我更新了帖子:添加了关于“{()}”不是空集的注释,以防其他人犯同样的错误。谢谢你,@ctrueden! (2认同)

Bri*_*ton 5

这取决于您是希望文字进行比较还是分配.

如果要将现有集设置为空,则可以使用.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)

  • `a = set()`不会*清空set*,但会创建一个新的set并将其分配给`a`,覆盖任何先前的值. (8认同)
  • 而不是`if len(a)== 0:`它就足以写出`if a:`(编辑:或者更确切地说,`if not a:`来匹配条件的极性). (3认同)