2016-06-02 4 views
-1

属性名とスコアを持つオブジェクトのセットがWです。 __hash__()関数は名前にのみ基づいており、__eq__()関数は定義されていないので、__hash__()関数に基づいています。Python:オブジェクトのセットを検索する

ここでは、オブジェクトのスコアを使用します。次のスクリプトよりもインスタンスへの参照方法が簡単ですか?セットの仕組みを考えると、

tmp_obj = W(name="myname", score=0) 
for obj in w_set: 
    if obj == tmp_obj: break 
else: 
    # do nothing with obj 
# do something with obj.score 
+0

私はあなたのインクルードされたスクリプトが何をすべきか理解できません。 –

答えて

1

あなたはセットのメンバーシップを確認するためにin演算子を使用することができます...がなければなりません。これは、セットとディクショナリがハッシュテーブルとして実装されているため、セットとディクショナリでは一定の時間演算です。リストとタプルについては、inは線形時間です。

obj = W("myname", 0) 
if obj in w_set: 
    # do something with obj 
+0

しかし、私は、一時的なオブジェクトのスコアではなく、セット内のオブジェクトのスコアを使用したいと思います。 *編集の質問* – Lewistrick

+0

なぜ一時的なオブジェクトが必要ですか? –

0

オブジェクトを設定する方法は言わないが、if obj.score == 0を使用しないのはなぜですか?

for obj in w_set: 
    if obj.score == 0: 
     break 

おそらくあなたの質問は線形検索を避けることですか? オブジェクトがたくさんあり、スコアで多くの検索を行う場合は、オブジェクトにインデックスマッピングスコアを作成する必要があります。おそらく(セットでも動作します)複数のオブジェクトが同じスコアを持つことができるので、私たちは、それぞれのスコアのためのリストを構築します:

from collections import defaultdict 

score_index = defaultdict(list) 
for obj in w_set: 
    score_index[obj.score].append(obj) 

検索せずにスコアゼロを持つすべてのオブジェクトのリストの上にあなたができる今のループ:

for obj in score_index[0]: 
    # Do something 
関連する問題