3

「追加」されたオブジェクトを効率的に追跡し、メンバーシップをテストできるデータ型が必要です。他の機能は必要ありません。

私の知る限り、Pythonにはそのようなデータ型はありません。私が欲しいものに最も近いのはセットですが、セットは常に値を格納します(私は必要ありません)。

現在、私が思いつくことができる最善の方法はhash()、各オブジェクトを取得してセットに格納することですが、下位レベルではハッシュのハッシュが計算され、ハッシュ文字列が値として格納されています。

実際に何も指さずに、セットの低レベルのルックアップ機能だけを使用する方法はありますか?

4

2 に答える 2

3

基本的に、いいえ。コメントで指摘したように、2つの等しくないオブジェクトが同じハッシュキーを共有する可能性は完全にあります。

ハッシュキーは、何もオブジェクトではなく、0個以上のオブジェクトを含むバケットを指します。次に、セットの実装は、オブジェクトがセット内にあるかどうかを判断するために、これらのそれぞれに対して同等性の比較を行う必要があります。

したがって、同等性の比較を行うには、少なくとも十分な情報が常に必要です。データのサブセット、たとえば2つまたは3つのフィールドで同等性を判断できる非常に大きなオブジェクトがある場合は、これらのフィールドだけで新しいオブジェクトを作成し、オブジェクト全体ではなくセットに保存することを検討できます。

于 2012-05-19T14:11:53.177 に答える
0

weakrefモジュールは、値を「保存」せずにメンバーシップをテストできる一連のコンテナーを実装します。欠点は、オブジェクトへの最後の強い参照が削除されると、オブジェクトが弱いコンテナーから消えることです。

これがあなたのために働くならば、WeakSetあなたが望むものです。

これがうまくいかない場合は、確率的(誤検知があります)であるが、目的のために堅牢な(デフォルトは誤検知がない)ブルームフィルターが必要なようです。

典型的な配置は、「フィルターを試してみてください。いいえの場合はいいえです。はいの場合は、ファイル内の単語リストなどの遅い方法を確認してください」です。

于 2016-12-06T13:29:47.210 に答える