2017-05-17 6 views
6

こんにちは、私はPythonで2つのリストを持っており、両方のリストから共通の値を削除したいとします。解決策の1つは、Pythonの2つのリストから共通の値を削除する

x = [1, 2, 3, 4, 5, 6, 7, 8] 
y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4] 
for i in x: 
    if i in y: 
     x.remove(i) 
     y.remove(i) 

正しいと思われます。その理由は、リストから項目を削除すると、その指標が繰り返し処理されるためです。したがって、値がお互いに近いリスト内の2つの共通の値については、後の値が欠落します(コードは反復しません)。 結果は次のようになります。

>>> x 
[1, 3, 5, 6, 8, 9, 10] 
>>> y 
[43, 3123, 543, 76, 879, 32, 14241, 342, 3] 

だから我々は値'3'が欠落しています。

私が言及した動作の理由はありますか?または何か他のことを間違っているのですか?

+0

はい、これは、オブジェクトの反復処理中にオブジェクトを変更することによって発生する問題です。 –

+0

この質問を見てください:[反復処理中にリストから項目を削除する](https://stackoverflow.com/questions/1207406/remove-items-from-a-list- while-iterating) – direprobs

+0

これは強くお勧めします反復処理中の値を変更します。これは、あなたのコードが何をしているのかを理解しようとする人にとって、ループの流れを判断することを困難にする可能性があります。このような場合は、通常、リスト(または他の反復可能オブジェクト)の別のコピーを変更するか、インデックスを繰り返してリストにスライスすることをお勧めします:for i in range(len(x)):print (x [i]) ' – Aaron

答えて

8

ただ、わずかなコピーを繰り返し処理し、あなたのコードを変更しますxのそれはx[:]です。あなたはそれを反復しながらリストを変更しています。だから、あなたが値に3

for i in x[:]: 
     if i in y: 
      x.remove(i) 
      y.remove(i) 

や代替方法

x,y = [i for i in x if i not in y],[j for j in y if j not in x] 
+0

リスト中に重複した値がある場合、それは動作しません。 'x = [1、2、3、4、5、6、7、8、3]' y – DSLima90

+0

@ DSLima90私はOPの要件まで、彼は重複のすべての出現を削除したいと思う場合は動作しません。しかし、両方のリストから削除した後は、最初のリストで一意になります。だからそれは問題ではない。 –

+0

@Rhaulはい、そうです。私はOPが提供されたコードの私の解釈によってすべての出現を削除したいと思った。これは有効な回答ですが、これまでのところ、それは他の回答とは異なることに注目する価値があります。 – DSLima90

3
z=[i for i in x if i not in y] 
w=[i for i in y if i not in x] 
x=z 
y=w 

これはすべきことですか?それは少しメモリ効率が良いです。

+0

これは私が最後にしたものです。ありがとう – MaPy

+0

これは、 'x、y = [私はyがない場合はxのiの場合]、[iがxの場合はyのiのために]'に凝縮することができます。 –

2

あなたがnumpyを使用する場合は、あなたが必要とするすべてがある:

x, y = np.setdiff1d(x, y), np.setdiff1d(y, x) 

、あなたがnumpyのを使用しない場合:

x, y = list(set(x).difference(y)), list(set(y).difference(x)) 
6

が欠落している理由ですまたsetオブジェクトの違いを使用することができます。

私は個人的にPythonの setデータ型が進むべき道だと思います
a = list(set(y) - set(x)) 
b = list(set(x) - set(y)) 
+0

これは、重複したアイテムをすべて削除して注文を失うという欠点があります。しかし、これをやりたい人にとっては、問題ではない – abccd

1

あなたはこのような何か行うことができます。

>>> x = [1, 2, 3, 4, 5, 6, 7, 8] 
>>> y = [43, 3123, 543, 76, 879, 32, 14241, 342, 2, 3, 4] 
>>> sx = set(x) 
>>> sy = set(y) 
>>> sx.union(sy) 
set([1, 2, 3, 4, 5, 6, 7, 8, 32, 43, 76, 342, 543, 879, 3123, 14241]) 

それとも、1つのライナーにそれを減らすことができます

list(set(x).union(set(y))) 
関連する問題