空集文字?


460

[] =空 list

() =空 tuple

{} =空 dict

空有类似的记号set吗?还是我必须写set()


12
您不接受{[i] for i],不是吗?
utdemir 2011年

3
只想显示python几乎所有的功能。如果要创建一个集而不使用set(),则可以。
utdemir 2011年

6
是的,您几乎可以用一百种方式完成所有事情。我并没有添加map(lambda x: x)代码示例只是为了向您展示它的工作原理。它也不是固定的字面量,而是固定的理解力。

130
一种行之有效的愚蠢方法{0}-{0}。它不如清晰set(),但确实具有看起来像一双有趣的眼睛的优点。
2014年

10
@Chris {}是一本字典。{0}是一套。{0} - {0}是集合与它本身(空集合)之间的差异。
michaelsnowden

Answers:


520

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


您的意思是空集没有文字语法吗?还是一般的套装?
约翰·拉德(JohanRåde)2011年

15
有设置的文字,但仅在Python 3.x中。两种方式都没有空集的文字。

2
@ user763305:关于这一点,语言手册非常清楚。 docs.python.org/library/stdtypes.html#set-types-set-frozenset说:“非空集...可以通过在括号内放置以逗号分隔的元素列表来创建”
S.Lott

43
实际上,设置文字已经被移植到Python 2.7,所以他们不仅提供严格的Python 3
吉姆Brissom

13
@andy这不是一个空集合,而是一个包含数字1的集合。顺便说一下,您不需要结尾的逗号-仅对元组是必需的。
sepp2k 2015年

53

一定请使用 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
ogurets

9
@ogurets,set()对于代码维护者而言,可能更容易理解,而且通常比性能更重要。{*()}在几乎贬义的意义上似乎“聪明”。
Benjimin

嘿,那很聪明。
科瓦尔斯基

46

只是为了扩展公认的答案:

从version 2.73.1python起,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


12
这个答案是错误的。仍然没有文字语法来表示一个空集。{}.__class__仍然会给dict
Ninja420 '16

8
@ Ninja420尝试在评论之前先阅读,我注意到
Reishin

3
接受的答案仍然是正确的,并且不会过时。空集没有文字语法,但是空字典有一种文字语法。
AndreasHassing '16

2
@AndreasBjørn为空是,但是对于非空,您将得到PEP8异常和建议使用set字面量。
Reishin '16

实际上,{}.__class__返回的<class 'dict'>'是pyt3.6,而不是<type 'dict'>
klew

6

这取决于您是否要使用文字进行比较或赋值。

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

8
a=set()不会清空集合,而是创建一个新集合并将其分配给,从而a覆盖任何先前的值。
gerrit 2014年

确实。这就是为什么我说如果要避免创建新对象,应使用clear()。我想我的评论的措词应该略有不同。
Brian Minton

它看起来也a.clear()比使用方法要快一些a=set(),并且检查len(a)==0要比对等检查要快一些a==set()
Brian Minton 2014年

3
取而代之的if len(a)==0:是仅写if a: (编辑:或更确切地说,if not a:匹配条件的极性)就足够了(并且更加Pythonic )。
Jim Oldfield's

2

更加疯狂的想法是:在Python 3接受Unicode标识符的情况下,您可以声明一个变量ϕ = frozenset()(ϕ为U + 03D5)并使用它。


4
问题是,set对象是易变的,因此使用会使您面临风险spam = ϕ; spam.add("eggs")
drdaeman

3
如果ϕ为Frozenset,则spam.add("eggs")失败,因为Frozenset对象没有任何add方法。
布赖恩·明顿

1
@BrianMinton:但这是预期的行为。请注意,当某人同时写了span = ϕ两者spanϕ指向同一对象时,即id(span) == id(ϕ)。因此,如果spam.add("eggs")可行,则该ϕ对象将不再是空集,我们将回到原来的问题,正如drdaeman所指出的那样
Renato Garcia

1
@RenatoGarcia与空的dict文字进行比较:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

是。适用于非空dict / set的相同表示法适用于空dict / set。

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

{1: 'a', 2: 'b', 3: 'c'}-一个数字键-值对的内部使得dict
{'aaa', 'bbb', 'ccc'}-一个元组值的内部使一个set

所以:

{}==零个键值对==空dict
{*()}==空值元组==空set

但是事实是您可以做到,但这并不意味着您应该这样做。除非您有很强的理由,否则最好显式构造一个空集,例如:

a = set()

注意:正如评论中注意到的那样,{()}不是一个空集合。这是一个包含1个元素的集合:空元组。


2
{()}不是空集。它是一个具有一个元素的单例集:一个空的元组。您可以通过检查验证这一点len({()}),这将是1,或者() in {()},这将是True
ctrueden

1
糟糕,您是对的!我更新了帖子:添加了关于{()}不是空集的说明,以防其他人犯同样的错误。谢谢@ctrueden!
pycoder '19

-1

有几种方法可以在Python中创建空Set:

  1. 使用 set()方法
    这是python中的内置方法,可在该变量中创建Empty set。
  2. 使用clear()方法(创造性的工程师技术LOL)
    请参见以下示例:

    sets = {“ Hi”,“ How”,“ are”,“ You”,“ All”}
    类型(集合)(此行输出:set)
    集合.clear()
    print(sets)(此行输出:{})
    type(sets)(此行输出:set)

因此,这是创建空Set的2种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.