2016-04-09 4 views
0

У меня есть следующий код:Python, поиск уникальных слов в нескольких списках

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 

Цель состоит в том, что она в основном выводит (содержимое списка а) - (содержимое списка б) так разыскиваемый результат в этот случай будет = [ «является», «привет»]

, но когда я запускаю мой код я получаю = [ «как», «является», «вы»]

может кто-либо точка что не так с моей реализацией, или есть еще один лучший способ решить эту проблему?

+2

Не изменяйте длину списка во время итерации по нему. Кроме того, если заказ не подходит, вы можете просто «напечатать набор (a) - установить (b)». – jonrsharpe

ответ

0

Причиной этого является, потому что вы мутирует список a в то время как итерация над ним.

Если вы хотите, чтобы правильно его решить, вы можете попробовать метод ниже. Он использует список понимание и словарь, чтобы отслеживать количество слов в результирующем наборе:

>>> 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

Вы можете использовать set, чтобы получить все не повторяющиеся элементы

Таким образом, вы могли бы сделать set(a) - set(b) для разности множеств

+0

это работает в той степени, в которой он дает мне любые слова, встречающиеся в a и никогда не в b, но я все еще не получаю результат, который я ищу, он дает мне a = ['are'] вместо a = [ 'are', 'hello'] –

0

set(a+b) в порядке, тоже. Вы можете использовать наборы, чтобы получить уникальные элементы.

Смежные вопросы