内のオブジェクトのリスト内検索は、以下の目的を前提とします。は、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どのようになるか、上記のコードを想定すると?
ありがとうございます。
内のオブジェクトのリスト内検索は、以下の目的を前提とします。は、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どのようになるか、上記のコードを想定すると?
ありがとうございます。
比較で繰り返しを使用します。
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)
ニースですが、 'next'はオプションのデフォルト値を取ることに注意してください - あなたが1つを渡すと、' StopIteration'例外は発生しません。 – senderle
@sendle:良い点;私はそれを簡単に忘れてしまった。今すぐ答えに統合。 –
'i.id1 == id1とi.id2 == id2とi.id3 == id3'の代替コードスタイルは'(i.id1、i.id2、i.id3)==(id1、id2、 id3) '。値の意味によっては、この値がよりわかりやすくなることがあります。 –
>>> [x for x in t if x.id1==200 and x.id2==201 and x.id3==193]
[<__main__.Test object at 0x00BA3030>]
を使用すると、オブジェクトの多くを持っているし、必要に何度も一致するものを見つけたら、最初に(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
を使用し、完全検索を避けることができない場合、すなわち)
リストにあなたのオブジェクトを格納するためにが必要た場合、私はタプルとして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
「t」の特定の順序を維持する必要がありますか、それとも並べ替えることができますか? 't'の中でインスタンスを繰り返し探しますか? –
私は、質問にはい、リストtをソートできると述べたはずです。また、はい、私は繰り返しt内でインスタンスを探しています。 – ichigo
これはどのような種類のオブジェクトですか?あなたが探しているもののid1、id2、id3をすでに知っているなら、なぜ実際のオブジェクトが必要なのですか?あなたは本当にいくつかの種類のIDを基礎となるオブジェクトに関連づけたいですか?私。 ID値はデータの基本的な部分ですか、あるいはそれらを検索するために使用するものですか? –