2016-03-30 12 views
2

目標:動的に(1)テストすることをリスト内包で条件文作成 - すなわち、各反復時には - 要素がリストにない場合は理解しているが(2)各繰り返しでリスト自体が更新されます。ダイナミック自己参照リスト内包の条件

背景コード:

arr = [2, 2, 4] 
l = list() 

所望の出力:

l = [2, 4] 

を介して所望の行動forループ:

for element in arr: 
     if element not in l: 
      l.append(element) 

誤ったリストの内包ない発生望ましい行動:修正再表示

l = [element for element in arr if element not in l] 

は、質問:それは必要な動作を生成するようにどのように私はリスト内包を修正しない、すなわち、所望の出力は、前述しましたか?

+1

あなたが理解している同じリストを変更することはできません –

+0

これにリストの理解を使用する必要がありますか?セットはOKですか? –

+0

重複を単に削除したい場合は、http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in-python-whilst-保存の順序 – SwiftsNamesake

答えて

0

リストの補完を絶対に使用する必要がある場合は、forループを1つに再作成することができます。欠点は、それが何list.append戻っているので、あなたがNone要素のリストで終わるだろうということです:あなたが内包表記に関連付けられている場合

>>> arr = [2, 2, 4] 
>>> l = list() 
>>> _ = [l.append(element) for element in arr if element not in l] 
>>> print(l) 
[2, 4] 
>>> print(_) 
[None, None] 

、必ずしもそうとは限らないが内包表記を一覧表示するには、あなたが示唆発電の理解を使用することができます〜によって@tdelaney。これは不要な副産物を作りませんし、あなたが望むものを正確に行うことになります。

>>> arr = [2, 2, 4] 
>>> l = list() 
>>> l.extend(element for element in arr if element not in l) 

どちらの場合よりも良い方法は、元のリストをセットに入れてからリストに戻すことです。リストを拡張するためにセットを使用する利点は、以前の包含をチェックした後にエレメントを追加する方がはるかに高速であることです。リストは線形検索を行い、要素を追加するたびに再割り当てする必要があります。

>>> l = list(set(arr))