2017-05-18 12 views
1

を避けlはforループは3 forループ

for obj in firstArray: 
    newListKeys.append(obj.key) 

for key in anotherArray: 
    if key not in newListKeys: 
     soonToDelete.append(key) 

for key in soonToDelete: 
    del anotherArray[key] 
+3

あなたは何を達成しようとしていますか? 1つの配列内の他のキーに表示されないすべてのキーを削除しますか? – TemporalWolf

+1

@ErnestAppiah、そうですね、それは残念です。 – ForceBru

+0

最初の2行をobj.keys()に置き換えることができます –

答えて

2

を3を使用せずに以下のコードを最適化することができる方法は、ここでリストの内包表記を使用して1つのライナーですあり:

anotherArray = [a for a in anotherArray if a in {obj.key for obj in firstArray}] 

それが作成する方が簡単です既存のリストから要素を削除するよりも新しいリスト。

+0

リストに '.keys()'メソッドがありません – panatale1

+0

@ panatale1申し訳ありませんが、私は質問を読んでいません。 – abccd

4

あなたはリストの内包表記を使用することができます

# This replaces the first for loop 
newListKeys = [obj.key for obj in firstArray] 
# This replaces the second and third loops 
anotherArray = [item for item in anotherArray if item in newListKeys] 
+0

リストをセットで置き換える方が賢明でしょう。 'newListKeys = set(firstArrayのobjのためのobj.key)'。より安価なルックアップ。 – drdaeman

+0

おそらく、オブジェクトの初期配列の大きさによって異なります。 – panatale1

1

もう1つのライナーオプション:

anotherArray = [e for e in firstArray for key in anotherArray if e.key == key] 
+0

あなたはそうです。一定。 – lufte

2

について

anotherSet = set.intersection(set(obj.key for obj in firstArray), set(anotherArray)) 

newListKeysanotherArrayの間で共通しているユニークなキーのセットを返しますどのように。リストが必要な場合は、リストにキャストすることができます:anotherArray = list(set.intersection(newListKeys, set(anotherArray)))anotherArrayの各キーのコピーを1つだけ返しますが、キーのリストであれば、重複することはできません。