2017-03-08 17 views
0

実装したいプログラミングパターンは次のとおりです。コレクションにコレクションがない場合はオブジェクトを作成します。 コレクションに追加します。そうでなければ、コレクション内の同等のオブジェクトを更新します。存在しない場合、作成するためのPythonコレクション

class PersonStats(object): 
    def __init__(self, i): 
     super(PersonStats, self).__init__() 
     self.id = i 
     self.stats = 0 

    def update_stats(self): 
     self.stats += 1 

    def __key(self): 
     return self.id 

    def __eq__(self, y): 
     return self.__key() == y.__key() 

    def __hash__(self): 
     return hash(self.__key()) 


s = set_like_collection() 

special_person = PersonStats(22222) 

r = s.find(special_person) 
if r is not None: 
    r.update_stats() 
else: 
    s.add(r) 

私はPythonのセットにfind関数がないことに驚きました。 (1つは、彼女が望むオブジェクトを見つけるためにセットを反復する必要があります) 私はdefaultdictを使用することができますが、私はPersonStatsのカプセル化を破ることが嫌い、上記の例では、人のIDを使用してください PersonStats 。

私の質問は、あなたがunordered_setを持つことができるPythonのデータ構造を知っていて、それを一定の時間内に見つけることができますか?
また、私はそれがすべて間違っていると思っているかどうかを知りたいです。
また、なぜPythonのセットにfind関数がないのかわかっている場合。

+3

オブジェクトがセット内にあるかどうかを調べるには、 'in'を使用します。たとえば、' a in my_set'です。 – nbro

+2

'find'はオブジェクト内の位置を返すときだけ意味を持ちます。 'set'は順序がないので、' in'はオブジェクトがセットに入っているかどうかを伝えます。 –

+0

「in」は一定の時間です。 – Denziloe

答えて

1
あなたが注文したセットを使用する場合があります

https://pypi.python.org/pypi/ordered-set

.index(...)機能がセットの「位置」を提供します。しかし、例外をキャッチしたいかもしれません。

関連する問題