web-dev-qa-db-ja.com

dictとsetの違い(Python)

だから、私はこれを知っています、

a = {}  # dict

空の辞書を作成します。さて、これも取り上げました。

b = {1, 2, 3}  # set

セットを作成します。これは、次のように簡単に確認できます。

>>>print(type(a))
<class 'dict'>

>>>print(type(b))
<class 'set'>

私はそれが何をするのか理解していますが、whyが見当たりません。セットと辞書の両方に同じ構文を使用しています。マニュアルの set および dict セクションで、この背後にあるロジックに関する情報を見つけようとしましたが、残念ながら、それから何も得られませんでした。

この方法でこれを行う理由を誰かが説明できますか?それは歴史的な理由によるものですか、それともあからさまに明らかな何かを見逃していますか?

37
N. Wouda

set literalsはありませんでしたPython 2、歴史的に中括弧は辞書にのみ使用されていました。セットはリスト(または任意のイテラブル):

_set([1, 2, 3])
set([i for i in range(1, 3)])
_

Python 3は、中間リストを回避できるセットリテラルと内包表記( PEP-31 を参照)を導入しました。

_{1, 2, 3}
{i for i in range(1, 3)}
_

ただし、空のセット形式は、後方互換性のために辞書用に予約されていました。 [Python-3000] P3Kで設定? 状態からの参照:

何か解決できると確信しています---同意します。空の辞書には_{}_、空の辞書には_{:}_が理想的です。 PEPを最初に書いたときに「特別な空のオブジェクト」のアイデアが好きでした(つまり、_{}_をセットまたはディクテーションに変えることができます)。初心者の心の混乱に加えて(実装するのが面倒です)。

後続のメッセージ は、これらのルールをより詳しく説明しています。

Guidoが最善の解決策だったと思います。空のセットにはset()を使用し、空のディクテーションには_{}_を使用し、セットの内包/表示には_{genexp}_を使用し、明示的なセットリテラルには_{1,2,3}_を使用し、_{k1:v1, k2:v2}_ dictリテラル用。需要が嫌悪感を超える場合は、後で_{_/_}_をいつでも追加できます。

32
myaut

構文はnotと同じです。辞書は最初に中括弧を使用し、key-valueペアを指定します。ここで、キーと値はコロンで区切られます。

_>>> {'foo': 'bar'}
{'foo': 'bar'}
>>> type(_)
<type 'dict'>
_

後で言語にセットが追加され、_{..}_波括弧表記は名前だけelementsであり、ペアではありません:

_>>> {'foo'}
set(['foo'])
>>> type(_)
<type 'set'>
_

Python 2)では、インタープリターはset()呼び出し可能オブジェクトを使用してオブジェクトをエコーし​​ます。これはemptyセットを指定する方法でもあります。

_>>> emptyset = set()
_

Python 3)では、オブジェクトが空でない限り、新しい_{..}_表記がオブジェクトをエコーするときに使用されます。

_>>> {'foo'}
{'foo'}
>>> _ - {'foo'}  # difference, removing the one element
set()
_

set()タイプは、Python言語の バージョン2.4PEP 218 を参照)、中括弧に追加されましたセットリテラルの構文は added in Python and back-ported to Python 2.7

12
Martijn Pieters

{}が空のセットではなく空の辞書に使用されるという事実には、主に歴史的な理由があります。辞書の{'a': 100, 'b': 200}構文は、Pythonの初めから存在していました。セットの構文{1, 2, 3}は、Python 2.7。で導入されました。{}は長い間使用されてきたため、空の辞書を定義する方法として残ります。 Pythonが最初から新しいセット構文を持っている場合、空のセットは{}で定義され、空の辞書は{:}で定義される可能性があります。

6
Mike Müller