中括弧を使用してPythonでセットを初期化する


98

私はpythonを学んでいて、セットの初期化について初心者の質問があります。テストの結果、セットは次のように初期化できることがわかりました。

my_set = {'foo', 'bar', 'baz'}

次の標準的な方法とは対照的に、この方法を使用することの欠点はありますか?

my_set = set(['foo', 'bar', 'baz'])

それとも単なるスタイルの問題ですか?


2
ドキュメンテーションはそれを述べていますが、そこにはありません。これは非推奨のモジュールのドキュメントであり、実際のセットは組み込みになっていることに注意してください。「Python 2.7の新機能」ドキュメントにあり、言語リファレンスで簡単に説明されています。docs.python.org

@delnan私はpython 2.7を使用しているので、python 3のドキュメントを調べようとは思いませんでした。私が投稿したリンクは2.7用ですが、奇妙なことにこれについて言及していません。
fvrghl 2013年

1
私はコメントを編集してから、2.7のドキュメントにもこれが記載されています。あなたが投稿したリンクは古く、過去の遺物であり、間違っており、非推奨です。それはそれ自体ではなく、使用することを説明しますどのような存在し、使用することを忘れ:docs.python.org/2/library/stdtypes.html#setdocs.python.org/2/library/stdtypes.html#frozenset

@delnan助けてくれてありがとう。質問を編集して、ドキュメントがないとは言わないようにしました(ただし、これについてオンラインで言及している例はほとんどありません)。
fvrghl 2013年

通行人の場合:リテラルを使用できる場合、Pycharmは関数呼び出しの使用を警告します-パフォーマンス上の理由がある可能性があるため、新しいコードではリテラルを設定する方法を好む
Mr_and_Mrs_D

回答:


101

セットリテラル構文には2つの明らかな問題があります。

my_set = {'foo', 'bar', 'baz'}
  1. Python 2.7以前では使用できません

  2. その構文を使用して空のセットを表現する方法はありません(使用{}して空の辞書を作成します)

それらはあなたにとって重要かもしれませんし、そうでないかもしれません。

この構文の概要を示すドキュメントのセクションはこちらです。


45

{}との違いset()を1つの単語の引数と比較します。

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

しかし、両方abコースのセットです。


4
そのため、私set([])は単にセットコンストラクターではなく、セットコンストラクターを思い出しset()ます。
Michael Ekoka 2016

3
set()常に単一の引数を取ります。単一の反復可能。
ジョージケトルバラ

1
@GeorgeKettleboroughは、単一引数または引数なし、後者は空のセットを作成します。
gertvdijk

28

Python 3のドキュメントから(Python 2.7でも同じ):

中括弧またはset()関数を使用してセットを作成できます。注:空のセットを作成するには、{}ではなくset()を使用する必要があります。後者は空の辞書を作成します。これは、次のセクションで説明するデータ構造です。

Python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

/に{}も使用されることに注意してください:mapdict

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

包括的な構文を使用してセットを初期化することもできます。

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

1

empty_set = set()空のセットを初期化する必要があり ます。{}空の辞書です。

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