web-dev-qa-db-ja.com

set()関数を理解する

Pythonでは、set()は、要素が重複していない順序付けられていないコレクションです。ただし、それが出力を生成する方法を理解することはできません。

たとえば、次のことを考慮してください。

>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3]
>>> set(x)
set([1, 2, 3])

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> set(y)
set([8, 1, 6])

>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7]
>>> set(z)
set([1, 6, 7])

set(y)の出力はset([1, 6, 8])であってはなりませんか?上記の2つをPython 2.6で試しました。

55

あなたが言うように、セットは順不同です。セットを実装する1つの方法はツリーを使用することですが、ハッシュテーブルを使用して実装することもできます(キーをソート順に取得するのはそれほど簡単ではない場合があります)。

それらをソートしたい場合は、簡単に実行できます:

sorted(set(y))

セットの要素を含むソート済みリストを作成します。 (セットではありません。再び、セットは順不同です。)

それ以外の場合、setによって保証されるのは、要素を一意にすることだけです(複数回存在することはありません)。

お役に立てれば!

67
user

順不同のコレクション型として、set([8, 1, 6])set([1, 6, 8])と同等です。

ソートされた順序でセットの内容を表示する方が良いかもしれませんが、それはrepr()呼び出しをより高価にします。

内部的に、setタイプはハッシュテーブルを使用して実装されます。ハッシュ関数を使用してアイテムを複数のバケットに分割し、アイテムがセットの一部であるかどうかを確認するために必要な等価演算の数を減らします。

repr()出力を生成するには、各バケットのアイテムを順番に出力しますが、これはソートされた順序ではありません。

13

+ボラティリティとあなた自身が指摘したように、セットは順不同です。要素を順番に並べる必要がある場合は、セットでsortedを呼び出すだけです。

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
6
I82Much

Pythonのセット(および辞書)はsomeの順序で繰り返し出力されますが、その順序は正確ではなく、追加や削除後も同じままであるとは限りません。

多数の値を追加してから削除した後のセットの変更順序の例を次に示します。

>>> s = set([1,6,8])
>>> print(s)
{8, 1, 6}
>>> s.update(range(10,100000))
>>> for v in range(10, 100000):
    s.remove(v)
>>> print(s)
{1, 6, 8}

ただし、これは実装に依存するため、それに依存しないでください。

5
Blckknght

他の答えを読んだ後、私はまだ理解できませんでしたwhyセットが順不同で出てきます。

私のパートナーにこれを言及し、彼はこの比phorを思いついた:ビー玉を取りなさい。それらを大理石の幅より少し広いチューブに入れます。リストがあります。ただし、セットはバッグです。ビー玉を1つずつ袋に入れても、それらをバッグからチューブに戻すと、それらは同じ順序にはなりません(バッグ内ですべて混同されるため)。

2
Ania