-1

setPythonでsを使用するコードを見つけました。リストを使ってそれらをエミュレートしようとしましたが、pop()それらからingすると異なる結果が得られます!

Ipythonを開いて、これらがどのように機能するかをテストしたところ、かなり奇妙なことがわかりました。

In [16]: x
Out[16]: set([])

In [17]: x.add("a")

In [18]: x.add("b")

In [19]: x.add("c")

In [20]: x
Out[20]: set(['a', 'c', 'b'])

cの前に追加されたので、cの前に'b'来るべきではありませんか?わかりません。

4

3 に答える 3

15

http://docs.python.org/library/stdtypes.html#set

順序付けされていないコレクションであるため、セットは要素の位置や挿入の順序を記録しません。したがって、セットは、インデックス作成、スライス、またはその他のシーケンスのような動作をサポートしていません。

セットの基礎となるデータ構造はハッシュマップであり、ここにはそれらに関する多くの情報があります。

于 2012-08-02T11:45:49.750 に答える
7

ウィキペディアのセットエントリを見ると、彼らは言います

抽象データ構造は、データのコレクションまたは集合体です。データは、ブール値、数値、文字、またはその他のデータ構造である可能性があります。パッケージング[1]またはインデックス作成[2]によって生成される構造を考慮すると、4つの基本的なデータ構造があります。[3] [4]

unpackaged、unindexed:bunch
packaged、unindexed:set
unpackaged、indexed:string(sequence)
packaged、indexed:list(array)

したがって、セットはインデックス付けされていないか、特定の方法で順序付けられていません。

Pythonのドキュメントはこれに同意します(常にドキュメントを確認してください。Pythonには私が見た中で最高のものがいくつかあります):

5.7。タイプを設定する

setオブジェクトは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。一般的な用途には、メンバーシップテスト、シーケンスからの重複の削除、交差、和集合、差、対称差などの数学演算の計算が含まれます。(他のコンテナーについては、組み込みのdict、list、tupleクラス、およびコレクションモジュールを参照してください。)

于 2012-08-02T11:50:49.270 に答える
1

jamylakcrashmstrがあなたに与えた良い答えに加えて、あなたは例でそれを自分で見ることができます。

>>> stringA="A"
>>> stringB="B"
>>> hash(stringA)
-269909568
>>> hash(stringB)
-141909181
>>> mySet = set()
>>> mySet.add(stringB)
>>> mySet.add(stringA)
>>> mySet
set(['A', 'B'])

そこで、「A」より前に「B」をセットに挿入しました。なぜ「A」、「B」が表示されるのですか(リストが順序を維持する場合)。さて、文字列「A」と「B」に対して計算されたハッシュを見てください。どちらが小さいですか?キーがそれらのハッシュである辞書で同じことをするとどうなりますか?:

>>> myDict = {-141909181: "B", -269909568: "A"}
>>> myDict
{-269909568: 'A', -141909181: 'B'}

たぶん、これはセットを少し理解するのに役立ちます。

于 2012-08-02T15:53:48.290 に答える