2017-04-09 7 views
-2

私はいくつかの数字(例:[2,3,5,6,6]のような)を持つリストを作成し、すべての重複を削除して新しいリストを作成するコードを書いています。([2,3,5,6] )。Python - リスト内のif文

私が持っているコードは、このです:

first_list = [2,3,5,6,6] 
second_list = [] 
second_list = [x for x in first_list if x not in second_list] 

しかし、それはfirst_listからsecond_listが等しくなり、私は理由を理解していません。上記で説明したことをどうすればいいのですか?

+0

なし 'X'理解は第二のリストが空であるという単純な理由のために評価された第二のリストです。 'second_list'がempytの時に –

+0

になると、リストの理解の間更新されません。 – bhansa

答えて

1

だけで重複を削除する代わりに、リストのセットを使用します。

first_list = [2,3,4,5,6,6] 
first_set = set(first_list) 
print(first_set) 

セットはsecond_listに重複

+0

私は初心者なので、セットについては知りませんでした。これはうまく動作します、ありがとう:) –

+0

これは、要素の順序が適切でないことを前提としています。 –

+0

私はちょうど 'newList = list(first_set) newList.sort()' –

2

割り当てを含めることはできませんが、リストの内包が完了した後に起こります。それはsecond_listを段階的に構築しません。あなたが書いたことはやっと同等です:

# this does not give the answer you want: 
temp = [x for x in first_list if x not in second_list] 
second_list = temp 

リストの内包がsecond_listに割り当てる前に、メモリ内のリスト全体を構築するためです。ビルド時にリストを確認したい場合は、通常のforループをappendと一緒に使用できます。より高速な方法については

second_list = [] 
for x in first_list: 
    if x not in second_list: 
     second_list.append(x) 

は、 set使用:

second_list = list(set(first_list)) 

しかし、これは必ずしもすべての重複を削除するにはfirst_list

+0

それは働いていません... –

+0

最初のコードブロックは、それが動作しない理由を説明しています。正しい方法には、2番目または3番目のコードブロックを使用します。 – James

1

の順序を保持しません、それは)(設定使用するのが最適です次のようになります。

first_list = [2, 3, 5, 6, 6] 
second_list = list(set(first_list)) 

ここでsecond_listにはすべてのあなたは、ループのために使用したい場合は、

を必要とする:あなたは秩序を維持する必要がある場合は

first_list = [2, 2, 3, 4, 6, 6] 
second_list = [] 
final_list = [] 
for i in first_list: 
    if i not in second_list: 
     final_list.append(i) 
     second_list.append(i) 

print final_list 
0

は、一つの方法は、使用することですOrderedDictのように:

コード:

second_list = OrderedDict([(x, None) for x in first_list]).keys() 

試験コード:

from collections import OrderedDict 
first_list = [2, 3, 5, 6, 6] 
second_list = OrderedDict([(x, None) for x in first_list]).keys() 
print(second_list) 

結果:

[2, 3, 5, 6]