2017-02-23 9 views
-3

他のリストから1つのリストを削除して、その要素を1回だけ削除する方法。次の例のように:私はセットで使用他のリストから1つだけリストを削除する方法

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 
Output=[6, 7, 3, 4, 4, 5] 

が、それは他のリスト

set(list1)-set(list2) 
output= {6, 7} 
を形成する1つのリストにあるすべての要素を削除する あなたは第二のリストを繰り返し処理してから要素を削除することができます
+1

何を試しましたか?あなたは何を持っているのですか? –

+0

'list2'の各項目に対して' list1'の最初に見つかった項目を削除しますか? –

+0

はい、最初に見つかった可能性があります。その単語の正しい単語は – Dani

答えて

0

見つかった場合は最初のリスト。以下はサンプルコードです:

for element in l2: 
if element in l1: 
    index = l1.index(element) 
    del l1[index] 

編集:コマンドラインからの入出力を参照してください。

入力:

>>> l1 = [1, 2, 3, 4] 
>>> l2 = [2, 3, 5, 6] 
>>> for element in l2: 
... if element in l1: 
... index = l1.index(element) 
... del l1[index] 
... 

出力:

>>> l1 
[1, 4] 
+0

です。このコードは機能しません。 – Dani

+0

どのようなエラーが表示されますか?私はあなたの2つのリストの違いを与えることを示すコマンドラインから入力/出力で私の答えを編集しました。あなたのコードに基づいて、あなたのコード内のリスト名をlist1とlist2に置き換える必要があります。 – RobinW2

0

は二つのリストを比較するには、リスト2を参照して問題を見てする必要があります。それぞれの複製を削除したいので、list2を反復処理し、list2の参照で見つかったlist1の各複製エントリを削除することができます。

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 
Output=[6, 7, 3, 4, 4, 5] 

for i in list2: 
    try: del list1[list1.index(i)] 
    except ValueError: pass 

項目がリスト2にある場合、それはリスト2に発生したとして、それが何回リスト1から削除され、最初よりも第二のリストに1つの項目のより多くの出現がある場合、エラーがキャッチされるこの方法です。

1

最初に、一意の要素(集合)の集合をリスト内で削除するものを選択します。次に、ユニークな要素が一度に1つずつ繰り返され、コレクション内にユニークな要素がなくなるまで、リストの要素の1つのインスタンスが削除されます。

li = [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
se = {1, 2, 3, 4, 5, 9} # 9 is intentionally added to show error handling 

for element in se: 
    try: 
     li.remove(element) 
    except ValueError: 
     print("Element '%s' doesn't exist in the list." % element) 

print(li) # prints: [6, 7, 3, 4, 4, 5] 

それはlist.remove()は、存在しないアイテムを削除しようとする試みが発生した場合ValueErrorを提起することに注意することが重要です。 1つのアプローチ(もっとpythonアプローチ)はtry-exceptブロックにエラーをキャッチすることです。エラーの処理方法を選択できます。私はちょうどエラーメッセージを印刷することを選択しました。もう1つの方法は、守備テストを行うことです。ここだのif-else守備のコーディングのために:

li = [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
se = {1, 2, 3, 4, 5} 

for element in se: 
    if element in li: 
     li.remove(element) 

print(li) # prints: [6, 7, 3, 4, 4, 5] 
1

1つのライナー悪用副作用
リストの内包出力が希望リストではありません - それは

list1= [1, 2, 3, 4, 5, 6, 7, 3, 4, 4, 5] 
list2= [1, 2, 3, 4, 5] 


[list1.pop(list1.index(e)) for e in list2 if e in list1] 
Out[65]: [1, 2, 3, 4, 5] 

list1 
Out[66]: [6, 7, 3, 4, 4, 5] 

を作品として、それはlist1を変更していることあなたが削除されたアイテムのリストの理解度を必要とするならば、もっと良く見えるでしょう。そうでなければ、forループを書いたばかりのときにリストの理解を濫用したと思うかもしれません。

関連する問題