2016-08-02 15 views
11

Ich habe das Gefühl, dass ich aufgefordert werde, zum 'Anfängerleitfaden' zu gehen, oder was hast du, aber ich habe diesen Code hierString-Übereinstimmungen zwischen zwei Listen für eine bestimmte Anzahl von Elementen in einer dritten Liste zurückgeben

does = ['my','mother','told','me','to','choose','the'] 
it = ['my','mother','told','me','to','choose','the'] 
work = [] 

while 5 > len(work): 
    for nope in it: 
     if nope in does: 
      work.append(nope) 

print (work) 

Und ich

['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 

Warum ist das? Und wie überzeuge ich es

['my', 'mother', 'told', 'me'] 
+0

Das ist wie ein Satz Kreuzung (abgeschnitten), obwohl die Mengen nicht geordnet sind. – smci

+0

Beachten Sie, dass die Verwendung der Anweisung 'while 5> len (work)' von vielen als unlogisch angesehen wird, was zu dem Namen ["yoda conditions"] (https://en.wikipedia.org/wiki/Yoda_conditions) führt. Es ist natürlich so oder so :) –

+0

@WilliamCorrigan Sie sollten die Antwort akzeptieren, die Sie hilfreich fanden, um anderen Lesern zu zeigen, was geholfen hat, Ihr Problem zu lösen. – idjaw

Antwort

8

Sie zurückkehren könnte so etwas wie diese versuchen:

for nope in it: 
    if len(work) < 5 and nope in does: 
     work.append(nope) 
    else: 
     break 

Das Problem mit Ihrem Code ist, dass es funktioniert die Überprüfung der Länge der Arbeit, nachdem sie durch alle geschlungen haben die Artikel it und alle von ihnen hinzugefügt haben, die in does sind.

+0

Optimaler und klarer als meine Lösung. Ich habe meine gelöscht, um sicherzugehen, dass deine als die bevorzugte Lösung angesehen wird. +1 – idjaw

+0

@idjaw Vielen Dank! Es wurde nicht benötigt, um deine Antwort zu löschen :) – Christos

+0

Für diesen Fall mochte ich deine Lösung viel mehr als meine und hoffe, dass das OP das gleiche sieht. :) – idjaw

1

können Sie tun:

does = ['my','mother','told','me','to','choose','the'] 
it = ['my','mother','told','me','to','choose','the'] 
work = [] 
for nope in it: 
    if nope in does: 
     work.append(nope) 
work = work[:4] 
print (work) 

Es ist nur die Liste zu machen, ohne die Länge überprüft, dann schneiden und nur die vier ersten Elemente zu verlassen.

1

Alternativ kann ein wenig näher zu Ihrem ursprünglichen Logik zu bleiben:

i = 0 
while 4 > len(work) and i < len(it): 
    nope = it[i] 
    if nope in does: 
     work.append(nope) 
    i += 1 

# ['my', 'mother', 'told', 'me', 'to'] 
0

Just for fun, hier ist ein Einzeiler ohne Importe:

does = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 
it = ['my', 'mother', 'told', 'me', 'to', 'choose', 'the'] 
work = [match for match, _ in zip((nope for nope in does if nope in it), range(4))]