2014-06-20 29 views
5

Jest to przykład praktyka:Python lista odejmowanie

Napisz funkcję (list1, list2), które odbywają się w dwóch listach jako argumenty i zwraca listę, która jest wynikiem usuwania elementów z list1, które można znaleźć w list2.

Dlaczego ta funkcja [1, 3, 4] powrót i nie [4] jak myślałem, że będzie? Myślę, że ma to coś wspólnego z list1.remove(). Sądzę, że to coś oczywistego, ale nie widzę tego.

To działa na tych przykładach:

subtractList (['a', 'b', 'c', 'd'], ['x', 'y', 'z']) = 
    ['a', 'b', 'c', 'd'] 

subtractList([1,2,3,4,5], [2, 4]) = 
    [1, 3, 5] 

ale nie na ten temat:

subtractList(range(5), range(4)) 

Również zauważyłem, że usuwa nawet tylko numery z listy.

Oto kod:

def subtractList(list1,list2): 
    list1 = list(list1) 
    list2 = list(list2) 

    for i in list1: 
     if i in list2: 
      list1.remove(i) 

    return list1 

Mam rozwiązać tę praktykę z:

def subtractList(list1,list2): 

    new_list = [] 

    list1 = list(list1) 
    list2 = list(list2) 

    for i in list1: 
     if i not in list2: 
      new_list.append(i) 

    return new_list 
+4

Proszę naprawić formatowanie, w szczególności swojej wcięcia. W tej chwili trudno ci pomóc. – Ffisegydd

+0

Czy używasz Python 3 lub Python 2? – Ffisegydd

+0

Ponadto, ponieważ już przekazujesz listy (zakres (x) jest także listą), ponowne przekształcenie ich w listy ('list1 = lista (lista1)') jest niepotrzebne – thumbtackthief

Odpowiedz

4

Zmiana listę jako iteracyjne nad spowoduje to problemy. Twoje drugie rozwiązanie jest przyzwoite lub możesz sprawdzić "spis treści". W tym przypadku:

new_list = [num for num in list1 if num not in list2] 
+0

Dla tego, co jest warte, dla początkującego w Pythonie nie sądzę, że przyczyną twojego błędu jest w ogóle coś oczywistego :) – thumbtackthief

4

Wrażenie na profesora przez oszukiwania:

def subtract_list(l1, l2): 
    return list(set(l1) - set(l2)) 
+0

tak, myślałem także o zestawach lol – Jasko

+0

Może to zmienić kolejność list1. – dawg