空のリテラルセット?


461

[] =空 list

() =空 tuple

{} =空 dict

空の同様の表記はありますsetか?それとも私は書く必要がありますset()か?


12
あなたは{i for i in []}を受け入れませんね?
utdemir

3
ほぼすべてを表示したいだけの場合、Pythonで可能です。set()を使用せずにセットを作成する場合は、可能です。
utdemir

6
ええ、あなたは百すべての説得された方法でほとんどすべてを行うことができます。私がmap(lambda x: x)コードの例を追加するのは、それが機能することを示すためだけではありません。それもセットリテラルではなく、単なるセット内包です。

130
動作する愚かな方法はでしょう{0}-{0}。ほど明確set()ではありませんが、変な目のように見えるという利点があります。
2014年

10
@Chris {}は辞書です。{0}セットです。{0} - {0}セットとそれ自体、つまり空のセットの違いです。
michaelsnowden、2015年

回答:


519

いいえ、空のセットにはリテラル構文はありません。書いてくださいset()


空のセットにはリテラル構文がないということですか?それとも一般的なセットですか?
JohanRåde、2011年

15
設定されたリテラルがありますが、Python 3.xでのみです。どちらの方法でも、空のセットのリテラルはありません。

2
@ user763305:言語マニュアルはこの点でかなり明確です。 docs.python.org/library/stdtypes.html#set-types-set-frozensetは、「空でないセットは、中括弧内に要素のコンマ区切りリストを配置することで作成できます」と述べています
S.Lott

43
彼らは、Python 3には、厳密ではないだけで利用可能ですので、実際には、セットリテラルは、Pythonの2.7にバックポートされました
ジムBrissom

13
@andyそれは空のセットではありません-それは数値1を含むセットです。ところで、末尾のコンマは必要ありません-これはタプルにのみ必要です。
sepp2k

54

ぜひ、ご利用下さい 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
。–

9
@ogurets set()は(コード管理者にとって)理解しやすく、パフォーマンスよりも重要なことがよくあります。{*()}ほぼ軽蔑的な意味で「賢い」ようです。
ベンジミン

ええ、それは賢いです。
コワルスキー

46

受け入れられた答えを拡張するためだけに:

バージョンから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

8
@ Ninja420コメントの前に最初に読んでみて、私はそれに気づいた
レイシン

3
受け入れられた答えはまだ正しく、古くはありません。空のセットにはリテラル構文はありませんが、空の辞書にはあります。
AndreasHassing

2
@AndreasBjørnは空のyesですが、空でない場合はPEP8例外が発生し、リテラルを使用するように提案されます。
Reishin

実際に{}.__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 14

確かに。そのため、新しいオブジェクトの作成を避けたい場合は、clear()を使用する必要があると述べました。私のコメントは少し違った言い方であったと思います。
Brian Minton

また、使用して表示されるa.clear()方法が少し速くよりもa=set()、そしてチェックはlen(a)==0に平等をチェックするよりも若干速いですa==set()
ブライアンミントン

3
代わりにif len(a)==0:それを書くだけで十分です(よりPythonicです)if a: (編集:またはif not a:条件の極性を一致させるため)。
ジムオールドフィールド2015年

2

クレイジーなアイデアに追加:Python 3がユニコード識別子を受け入れることで、変数を宣言してϕ = frozenset()(ϕはU + 03D5です)、代わりにそれを使用できます。


4
問題は、setオブジェクトは変更可能であるため、を使用してリスクを負うことですspam = ϕ; spam.add("eggs")
drdaeman 2017年

3
ϕがfrozensetの場合spam.add("eggs")、frozensetオブジェクトにはaddメソッドがないため、失敗します。
Brian Minton 2017

1
@BrianMinton:しかし、それは意図された動作です。誰かがspan = ϕ両方spanを書きϕ、同じオブジェクトを指すときは注意してくださいid(span) == id(ϕ)。したがって、機能する場合spam.add("eggs")ϕオブジェクトは空のセットではなくなり、drdaemanによって指摘された元の問題に戻ります
Renato Garcia

1
@RenatoGarcia空のdictリテラルと比較します。– >>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
ブライアンミントン

1

はい。空ではないdict / setで機能するのと同じ表記が、空のもので機能します。

空でないリテラルdictとの違いに注意してくださいset

{1: 'a', 2: 'b', 3: 'c'}-内部のキーと値のペアの数がaになりますdict
{'aaa', 'bbb', 'ccc'}- 内部の値のタプルがaになりますset

そう:

{}==キーと値のペアの数がゼロ==空dict
{*()}==空の値のタプル==空set

しかし、あなたがそれを行うことができるという事実は、あなたがそうすべきだという意味ではありません。強い理由がない限り、次のように空のセットを明示的に作成することをお勧めします。

a = set()

注意:コメントでctruedenが気づいたように、{()}は空のセットではありません。空のタプルという1つの要素を持つセットです。


2
{()}は空のセットではありません。これは、1つの要素(空のタプル)を持つシングルトンセットです。len({()})これは、1か() in {()}、またはかを確認することで確認できますTrue
ctrueden

1
おっと、あなたは正しいです!私は投稿を更新しました:{()}他の誰かが同じ間違いをした場合に備えて、空のセットではないというメモを追加しました。@ctrueden、ありがとう!
pycoder

-1

Pythonで空のセットを作成する方法はいくつかあります。

  1. set()メソッドの使用
    これは、その変数に空のセットを作成するPythonの組み込みメソッドです。
  2. clear()メソッドの使用(クリエイティブエンジニアテクニックLOL)
    この例を参照してください:

    sets = {"Hi"、 "How"、 "are"、 "You"、 "All"}
    type(sets)(This Line Output:set)
    sets .clear()
    print(sets)(この行の出力:{})
    type(sets)(この行の出力:set)

したがって、これは空のセットを作成する2つの方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.