2016-06-04 8 views
1

Arbeiten an einigen grundlegenden Programmierübungen, aber war etwas verwirrt zu finden, dass die folgenden Code-Schnipsel nicht die gleichen Werte zurückgeben. Die Listenverständnis-Syntax scheint die "Nicht-in" -Schlüsselwörter, die ich in der Liste verwendet habe, die aus dem Listenverständnis selbst erzeugt wird, fast zu ignorieren. Ist dieses Verhalten nicht erlaubt? Die Funktion findet einfach, ob eine 1, 2 und 3 irgendwo in einer Liste von Ganzzahlen existiert.List Verständnis und "nicht in" Keywords

# Working, no list-comprehension 
def array123(lst): 
    my_lst = [] 
    for num in lst: 
    if num not in my_lst and (num == 1 or num == 2 or num == 3): 
     my_lst.append(num) 
    if sorted(my_lst) == [1, 2, 3]: 
    return True 
    else: 
    return False 

# List Comprehension 
def array123(lst): 
    my_lst = [] 
    my_lst = [num for num in lst if num not in my_lst and (num == 1 or num == 2 or num == 3)] 
    if sorted(my_lst) == [1, 2, 3]: 
    return True 
    else: 
    return False 
+1

Was sind deine Eingabe s und erwartete Ausgaben? – AK47

+1

Ergebnis des Listenverständnisses wird erst zugewiesen, wenn es abgeschlossen ist. Im ersten Fall wird 'my_lst' während des Schleifens aktualisiert. Im zweiten Fall ist es nicht. –

Antwort

1

in der Liste Comprehensions Version, gibt if num not in my_lst immer True weil my_lst[] zu diesem Zeitpunkt ist.

# List Comprehension 
def array123(lst): 
    my_lst = [] 

    my_lst = [num for num in lst 
       if num not in my_lst # always returns True for `my_lst=[]` 
         and (num == 1 or num == 2 or num == 3)] 

    print(my_lst) 

# Demo 
array123([1, 2, 3, 1, 2, 3]) 
# Output 
[1, 2, 3, 1, 2, 3] 

Sie wollen wahrscheinlich, wenn die einzigartigen Elemente einer Liste überprüfen 1, 2, 3 sind. Verwenden Sie set, hier ist es.

my_lst = [1, 2, 3, 1, 2, 3] 
b = set(my_lst) == set([1, 2, 3]) # True 

my_lst = [1, 2, 3, 1, 2, 4] 
b = set(my_lst) == set([1, 2, 3]) # False 
1

Ihr Zustand not in my_list wird immer True sein. Da Sie einzigartige Elemente erstellen, sollten Sie ein set Verständnis verwenden.

my_set = {num for num in lst if num == 1 or num == 2 or num == 3} 

Ihre if-or Bedingungen zu reduzieren:

my_set = {num for num in lst if num in (1, 2, 3)} 

Und Sie dann Ihre set in eine

my_list = list(my_set) 
1

Liste konvertieren oder verwenden Sätze:

#!python3 
_SET123 = {1,2,3} 

def array123(iterable): 
    return set(i for i in iterable if i in _SET123) == _SET123 



for x in "123", (1,2,2,2), [1,2,3], {1:"one", 3:"two", 2:"three"}: 
    print(x, array123(x))