2011-08-04 5 views
-1

完全なサンプルコード:typeBがtypeBlistの[typeB.typeA]のtypeAの場合:...アクセス型B if節の中で?

for typeA in typeAlist: 
    if typeA in [typeB.typeA for typeB in typeBlist]: 
    return typeB 

明らかにそれが動作しませんが、タイプAのオブジェクトに一致したタイプBのオブジェクトを取得するためのきちんとした方法が存在することになるようにそれは感じています。

私はそれを動作させると考えることができる唯一の方法は、typeA属性が一致してから壊れるまで、typeBlistを反復してforループを入れ子にすることです。よりクリーンな方法がありますか?それとも実際には十分に清潔ですか?

matching_typeBs = [ x for x in typeBlist if x.typeA in typeAlist ] 

答えて

3

あなたはあなたのリストの内包内ifを使用することができます:についてどのように

1

[typeB for typeB in typeBlist if typeB.typeA == typeA] 

これはtypeB.typeA == typeAためtypeBlistのすべてのメンバーを返します。

あなたはリスト全体動作を停止するジェネレータ式を使用することができる唯一のシングルマッチがあります確信している場合:

try: 
    return (typeB for typeB in typeBlist if typeB.typeA == typeA).next() 
except StopIteration: 
    return None 

あなたは、これは多くのことをルックアップやっている場合は、作成する方が簡単かもしれませんa をtypeAからtypeBにマップします。

lookup = dict((typeB.typeA,typeB) for typeB in typeBlist) 

あなたはそのようにように、これを再使用することができます。

typeB = lookup[typeA] 

をあなたはlisttypeBのSにtypeAをマップする各typeAあなたの検索のために多くのtypeBエントリを持っている可能性がある場合:

from collections import defaultdict 
lookup = defaultdict(list) 
for typeB in typeBlist: 
    lookup[typeB.typeA].append(typeB) 
0

フィルタステートメントと全く同じです(filtを使用するかどうかは自分で決めてくださいそれとも2番目の方が速いのですか):

filter(lambda x: x.typeA in typeAlist, typeBlist) 
関連する問題