2017-01-19 13 views
1

ich ein einfaches Programm erstellt haben, die Elemente aus einer Liste aus einer anderen Liste mit in Verfahren mindestens zwei Mal entfernt:entfernen Elemente aus einer Liste aus einer anderen Liste mit „während“

def remove(l_list,s_list): 
    """Removes items of s_list from l_list and returns the rest""" 
    res=[] 
    for item in l_list: 
     if item not in s_list: 
      res.append(item) 
    return res 

ich ersetzen wollen if not in s_list Operation durch die Schleife "während" und vergleichen Sie die Komplexität dieser Funktionen.

Also habe ich den folgenden Code aus (funktioniert nicht):

def remove2(l_list,s_list): 
    res=[] 
    for item in l_list: 
     found=False 
     i=0 
     while len(s_list)>i and not found: 
      if item==s_list[i]: 
       found=True 
       if not found: 
        res.append(item) 
      i+=1 
    return res 

Beispiele:

>>> remove2([1,2,3],[1,2]) 
[3] 
>>> remove2([1,2,3],[1]) 
[2,3] 

Was mache ich falsch? Was ist los mit meiner Logik?

+0

Sollte es in Ihrer ersten Variante nicht "ob Artikel nicht in s_list" sein? –

+0

@SimonFrome ja, danke –

Antwort

2

Sie sollten das Produkt nach der while-Schleife anhängen:

def remove2(l_list,s_list): 
    res=[] 
    for item in l_list: 
     found=False 
     i=0 
     while len(s_list)>i and not found: 
      if item==s_list[i]: 
       found=True 
      i+=1 
     if not found: 
      res.append(item) 

    return res 

Statt die found Variable verwenden können Sie dies vereinfachen, wenn Sie break verwenden:

def remove2(l_list,s_list): 
    res=[] 
    for item in l_list: 
     i=0 
     while len(s_list)>i: 
      if item==s_list[i]: 
       break 
      i+=1 
     else: 
      # this else belongs to the while loop and is executed if and only if 
      # the loop wasn't terminated by "break". 
      res.append(item) 

    return res 
0

Es gibt sicherlich einen logischen Fehler hier:

 if item==s_list[i]: 
      found=True 
      if not found: 
       res.append(item) 
     i+=1 

gefunden kann nie an, dass innere falsch sein, wenn - Sie setzen es nur zu Wahren!

Auch brauchen Sie müssen durch diese sorgfältige Prüfung gehen? Sie können "leicht" :-) dies mit einem einzeiligen Befehl tun. Mit nur Listenkomprehensionen:

return [item for item in l_list if item not in s_list] 

Sie können auch sie in Sätze drehen, nehmen Sie den Unterschied, und konvertieren zurück in eine Liste:

return list(set(l_list).difference(set(s_list))) 
+0

danke für die Antwort. Ich kann es in diesem Fall nicht mit List Comprehensions machen :(alles, was ich brauche, ist loop –

Verwandte Themen