2016-04-09 8 views
0

I次のコードを持っている:パイソン、複数のリストにユニークな単語を見つける

a= ['hello','how','are','hello','you'] 
b= ['hello','how','you','today'] 
len_b=len(b) 

for word in a: 

     count=0 
     while count < len_b: 

      if word == b[count]:  
       a.remove(word) 
       break 

      else: 
       count=count+1 

print a 

目標は、基本的には(リストAの内容)を出力ということです - ので(リストBの内容) 希望の結果ではこの場合は= [「ある」、「こんにちは」]

をしかし、私は自分のコードを実行したときに私が得る= [「か」、「ある」、「あなた」]

することができます誰でもいずれかのポイントになります私の実装で何が間違っているのか、これを解決するもう一つの良い方法がありますか?

+2

リストの反復処理中にリストの長さを変更しないでください。また、順序が関係しない限り、単に 'set(a) - set(b)'を印刷することもできます。 – jonrsharpe

答えて

0

の差をset(a) - set(b)を行うことができ、すべての非重複要素

を取得するためにsetを使用することができます。

正しく解決したい場合は、以下の方法を試すことができます。これは、結果セット内の単語の数を追跡するために、リスト内包表記や辞書を使用しています:

>>> a = ['hello','how','are','hello','you'] 
>>> b = ['hello','how','you','today'] 
>>> 
>>> cnt_a = {} 
>>> for w in a: 
...  cnt_a[w] = cnt_a.get(w, 0) + 1 
... 
>>> for w in b: 
...  if w in cnt_a: 
...   cnt_a[w] -= 1 
...   if cnt_a[w] == 0: 
...    del cnt_a[w] 
... 
>>> [y for k, v in cnt_a.items() for y in [k] * v] 
['hello', 'are'] 

それも、結果のリストには、重複がある場合に適しています。ただし、注文を保存しない場合がありますが、必要に応じて簡単に修正することができます。

+0

ありがとうございました。注文は私には重要ではない –

1

あなたは、あなたがそれを反復処理しながら、あなたがリストaを変異されているので、この理由は、セット

+0

これはある程度、ある単語がaに出現し、bでは決して出現しないことを私に与えるが、私はまだ私が探している結果を得ることはできない。それはa = ['are']の代わりにa = 'are'、 'hello'] –

0

set(a+b)も問題ありません。セットを使用して一意の要素を取得できます。

関連する問題