Python セットには順序があるように見えるのはなぜですか?

Barbara Streisand
リリース: 2024-11-14 22:27:02
オリジナル
566 人が閲覧しました

Why Do Python Sets Appear to Have an Order?

Python セットの見かけの順序を理解する

Python セットは本質的に順序付けされていませんが、一貫しているように見える表示順序には疑問が生じています。この記事では、この見かけの順序付けの背後にあるメカニズムについて説明します。

ハッシュとメモリ配置

Python はハッシュを使用して、セット内の要素のメモリ配置を決定します。各要素のハッシュが計算され、最後の N ビット (セットのサイズによって決定される) が配列のインデックスとして使用されます。これは、特定のハッシュ値を持つ要素が特定のメモリ位置に配置される理由を説明します。

衝突の解決

ハッシュの衝突が発生した場合 (2 つの要素が同じハッシュを持つ場合)、衝突解決アルゴリズムが介入します。このアルゴリズムは、どの要素が「最適な」メモリ位置を占めるかを決定します。解決プロセスは、セット内の要素の順序を部分的に決定します。

挿入順序 (Python 3.6 以降)

CPython 3.6 以降、辞書 (セットではなく) が追加されました。繰り返しの挿入順序を保持する機能。この機能により、要素のハッシュが競合する場合でも、要素が挿入されたのと同じ順序で反復されることが可能になります。ただし、この広告掲載オーダーの保存は現在セットには拡張されていません。

次の例を考えてみましょう。

set_1 = set([5, 2, 7, 2, 1, 88])
set_2 = set([5, 2, 7, 2, 1, 88])
print(set_1)  # prints set([88, 1, 2, 5, 7])
print(set_2)  # prints set([88, 1, 2, 5, 7])
ログイン後にコピー

この場合、一貫した順序付けは、すべての要素のハッシュ値が同一であるためです。ハッシュの衝突は同じ衝突解決をもたらし、同じ順序になります。

ただし、この順序は保証されておらず、要素が異なる順序で挿入されたり、ハッシュが変更されたりすると変更される可能性があります。例:

list1 = [8, 16, 24]
set(list1)        # prints set([8, 16, 24])
list2 = [24, 16, 8]
set(list2)        # prints set([24, 16, 8])
ログイン後にコピー

2 番目のセットの逆順序は、入力リストの並べ替えによる衝突解決の結果が異なる結果です。

結論

Python セット内の見かけの順序は、ハッシュ、メモリ配置、衝突解決の組み合わせから生じます。挿入順序は保証されていませんが、ハッシュの一貫性と衝突解決の結果により、一部のシナリオで発生する可能性があります。

以上がPython セットには順序があるように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート