2017-09-10 4 views
0

私は2つのリストを入力として受け取り、両方の共通の要素を持つ3番目のリストを重複しないで出力するこのコードを持っています。リスト内包で複数のAND条件を使用するには?

1つのアプローチは、うまく動作し、期待される結果を与えるコメント付きforループです。私はリストの理解でそれを達成しようとしていますが、それは重複を与えます。リストの内包を使用して重複を有する [1、2、3、5、8、13]

現在の結果: [1、1、2、3、5、8、結果予想

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
c=[] 
# for i in a: 
#  if i in b and i not in c: 
#   c.append(i) 

c = [i for i in a if i in b and i not in c ] 
print c 

それはリストの内包に内蔵されている間、13]私は2.7

答えて

4

にリストをのpythonを使用しています

自体を照会することはできません。条件i not in cは、常にリストのcompの実行直前の時点で同じ値のc(空のリスト[])を照会するので、次のサイクルで最後の反復で挿入されたものはコードで認識されません。


オプション1

順序は重要ではありません場合は、あなただけのset交差点実行することができます:場合

c = set(a) & set(b) 
print(list(c)) 
[1, 2, 3, 5, 8, 13] # Warning! Order not guaranteed 

オプション2

from collections import OrderedDict 

b = set(b) 
c = list(OrderedDict.fromkeys([i for i in a if i in b]).keys()) 
print(c) 
[1, 2, 3, 5, 8, 13] 
OrderedDictの使用するためのおかげを保持する上記の

c = [] 
b = set(b) 
for i in a: 
    if i in b and i not in c: 
     c.append(i) 

print(c) 
[1, 2, 3, 5, 8, 13] 

オプション3

Aわずかに速いバージョン:注文事項は、forループを使用します

関連する問題