2012-03-01 2 views
1

内のオブジェクトのリスト内検索は、以下の目的を前提とします。は、Python

t = [] 
t.append(Test(200,201,193)) 
t.append(Test(403,221,213)) 
t.append(Test(3,523,2003)) 

最も簡単な私はID1 = 403、ID2 = 221を持つオブジェクトを見つけるための方法、およびリストトンでID3 = 213どのようになるか、上記のコードを想定すると?

ありがとうございます。

+0

「t」の特定の順序を維持する必要がありますか、それとも並べ替えることができますか? 't'の中でインスタンスを繰り返し探しますか? –

+0

私は、質問にはい、リストtをソートできると述べたはずです。また、はい、私は繰り返しt内でインスタンスを探しています。 – ichigo

+0

これはどのような種類のオブジェクトですか?あなたが探しているもののid1、id2、id3をすでに知っているなら、なぜ実際のオブジェクトが必要なのですか?あなたは本当にいくつかの種類のIDを基礎となるオブジェクトに関連づけたいですか?私。 ID値はデータの基本的な部分ですか、あるいはそれらを検索するために使用するものですか? –

答えて

2

比較で繰り返しを使用します。

matches = [i for i in t if i.id1 == id1 and i.id2 == id2 and i.id3 == id3] 

あなたはそれがありますし、一つだけが知っている場合は、それをこの方法を行うことができます。しかし

match = next(i for i in t if i.id1 == id1 and i.id2 == id2 and i.id3 == id3) 

注意を、そのような項目がない場合、これはStopIterationを調達すること。あなたはそれが存在することがわからない場合、デフォルト値を指定できるようnextは、しかし、デフォルト値を取ることができます場合は

match = next((i for i in t if i.id1 == id1 and i.id2 == id2 and i.id3 == id3), None) 
+0

ニースですが、 'next'はオプションのデフォルト値を取ることに注意してください - あなたが1つを渡すと、' StopIteration'例外は発生しません。 – senderle

+0

@sendle:良い点;私はそれを簡単に忘れてしまった。今すぐ答えに統合。 –

+0

'i.id1 == id1とi.id2 == id2とi.id3 == id3'の代替コードスタイルは'(i.id1、i.id2、i.id3)==(id1、id2、 id3) '。値の意味によっては、この値がよりわかりやすくなることがあります。 –

1
>>> [x for x in t if x.id1==200 and x.id2==201 and x.id3==193] 
[<__main__.Test object at 0x00BA3030>] 
2

を使用すると、オブジェクトの多くを持っているし、必要に何度も一致するものを見つけたら、最初に(id1,id2,id3)というキーを持つ辞書に前処理する方が効率的かもしれません。そうすれば、O(1)でオブジェクトを見つけることができます。 Oでオブジェクトを見つけるために、そして、(1)

# In Python 2.7+ 
the_dict = {(o.id1, o.id2, o.id3) : o for o in objects} 
# In Python 2.6- 
the_dict = dict((o.id1, o.id2, o.id3),o) for o in objects) 

:辞書値としてオブジェクトを配置することは、それらをコピーしないことを

the_dict[(id1,id2,id3)] 

注意(パイソンを決して辞書を構築しないように

は暗黙的にコピーされるため)、メモリへの影響をあまり心配する必要はありません。 (あなたがdictを使用し、完全検索を避けることができない場合、すなわち)

1

リストにあなたのオブジェクトを格納するためにが必要た場合、私はタプルとしてIDを返すTestにメソッドを追加します。

class Test(object): 
    ... 
    def getids(self): 
     return (self.id1, self.id2, self.id3) 

あなたは、その後を検索するためのIDのあなたのタプルに対して、単純にループしてチェックすることができます。これは、インターフェイスをクリーンアップのような「簡単」である

for obj in t: 
    if obj.getids() == (403, 221, 213): 
     return obj 

。それをスピードアップするには、リストの代わりに辞書を使用する必要がありますし、ワンステップで、あなたのオブジェクトを取得することができます。

t = dict() 
obj = Test(403, 221, 213) 
t[obj.getids()] = obj  # Store in dictionary, using ID as the key 

あなたはその後、IDによってオブジェクトを取得、または任意で、tにそれらが存在するかどうかを確認することができます

found = t[(403, 221, 213)]  # returns object or raises KeyError 
found = t.get((403, 221, 213)) # returns object or returns None 
if (403, 221, 213) in t:   # True or False