2016-04-09 11 views
0

Ich habe den folgenden Code:Python, die Suche nach einzigartigen Worten in mehreren Listen

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 

Das Ziel ist, dass es im Grunde gibt (Inhalt der Liste a) - (Inhalt der Liste b) so das gewünschte Ergebnis in dieser Fall wäre a = [ ‚sind‘, ‚hallo‘]

sein, aber wenn ich meinen Code ausführen bekomme ich a = [ ‚wie‘, ‚sind‘, ‚Sie‘]

kann jemand entweder Punkt was ist falsch mit meiner Umsetzung, oder gibt es einen anderen besseren Weg, um das zu lösen?

+2

Ändern Sie nicht die Länge einer Liste, während Sie darüber iterieren. Auch wenn die Reihenfolge nicht relevant ist, können Sie einfach 'set (a) - set (b)' 'drucken. – jonrsharpe

Antwort

0

Der Grund dafür ist, tun könnte, weil Sie die Liste a mutieren, während über sie iterieren.

Wenn Sie es richtig lösen wollen, können Sie die folgende Methode versuchen. Es verwendet Liste Verständnis und Wörterbuch Überblick über die Anzahl der Worte in der Ergebnismenge zu halten:

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

Es funktioniert gut in Fall, wo es Duplikate sind, auch in der Ergebnisliste. Es kann jedoch nicht die Reihenfolge beibehalten, aber es kann leicht geändert werden, um dies zu tun, wenn Sie möchten.

+0

Vielen Dank für die Hilfe. Ordnung ist nicht wichtig für mich –

1

können Sie einen set verwenden alle nicht doppelte Elemente

So bekommen Sie set(a) - set(b) für den Unterschied von Sätzen

+0

Dies funktioniert in einem Ausmaß in der Tatsache, dass es mir gibt, was auch immer Wörter in einem und nie in b auftreten, aber ich bekomme immer noch nicht das Ergebnis, das ich suche, es gibt mir a = ['sind'] statt a = [ 'sind', 'hallo'] –

0

set(a+b) ist auch in Ordnung. Sie können Sets verwenden, um einzigartige Elemente zu erhalten.

Verwandte Themen