Mustard Tiger
Mustard Tiger

Reputation: 3671

Python, finding unique words in multiple lists

I have the following code:

 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  

The goal is that it basically outputs (contents of list a)-(contents of list b) so the wanted result in this case would be a = ['are','hello']

but when i run my code i get a= ['how','are','you']

can anybody either point out what is wrong with my implementation, or is there another better way to solve this?

Upvotes: 0

Views: 1561

Answers (3)

pkacprzak
pkacprzak

Reputation: 5629

The reason for this is because you are mutating the list a while iterating over it.

If you want to solve it correctly, you can try the below method. It uses list comprehension and dictionary to keep track of the number of words in the resulting 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']

It works well in case where there are duplicates, even in the resulting list. However it may not preserve the order, but it can be easily modify to do this if you want.

Upvotes: 0

Pythonista
Pythonista

Reputation: 11625

You can use a set to get all non duplicate elements

So you could do set(a) - set(b) for the difference of sets

Upvotes: 1

Eray Erdin
Eray Erdin

Reputation: 3149

set(a+b) is alright, too. You can use sets to get unique elements.

Upvotes: 0

Related Questions