59

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])?Python2.6で上記の2つを試しました。

4

5 に答える 5

74

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

それらを並べ替える場合は、次のように実行できます。

sorted(set(y))

これにより、セットの要素を含むソートされたリストが生成されます。(セットではありません。繰り返しますが、セットは順序付けられていません。)

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

お役に立てれば!

于 2013-03-03T02:45:12.003 に答える
14

順序付けされていないコレクションタイプとして、はとset([8, 1, 6])同等set([1, 6, 8])です。

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

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

出力を生成するために、repr()各バケットからアイテムを順番に出力するだけです。これは、ソートされた順序である可能性は低いです。

于 2013-03-03T02:46:28.610 に答える
7

+ボラティリティとあなた自身が指摘したように、セットは順序付けられていません。要素を整理する必要がある場合はsorted、セットを呼び出すだけです。

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
于 2013-03-03T02:43:38.560 に答える
5

Pythonのセット(および辞書)は、ある順序で反復および出力されますが、その順序が正確にどのようになるかは任意であり、追加および削除後も同じままであるとは限りません。

これは、多くの値が追加されてから削除された後のセットの変更順序の例です。

>>> 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}

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

于 2013-03-03T02:50:03.130 に答える
2

他の答えを読んだ後、私はまだセットが順序付けられていない理由を理解するのに苦労しました。

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

于 2017-08-25T20:23:14.393 に答える