2016-06-11 15 views
-1
group = range(1, 1001) 

for num in group: 
    num_length = len(str(num)) 
    for i in range(num_length): 
     if str(num)[i] == '1' or str(num)[i] == '7': 
      group.remove(num) 
     except ValueError: 
      pass 
     else: 
      pass 

Ich versuche, Zahlen zu entfernen, die die 1 oder 7 Ziffern in ihnen enthalten. Um zu vermeiden, "ValueError: list.remove(x): x not in list", fügte ich die "except ValueError: pass" hinzu. Allerdings habe ich jetzt die "SyntaxError: invalid syntax".Syntaxfehler bei Verwendung von außer ValueError?

Antwort

0

ValueError zeigt das Element, das Sie in der Liste entfernen möchten, das nicht in der Liste vorhanden ist. Und Sie müssen try und execpt verwenden. Deshalb ist es Shows invalid syntax.

try: 
    #Your action 
except ValueError: 
    pass 

Aber Ihr Problem können Sie so implementieren. Überprüfen Sie die ersten 10 Elemente der gefilterten Liste.

In [1]: num = range(1, 1001) 
In [2]: filtered_num = [i for i in num if '1' not in str(i) and '7' not in str(i)] 
In [3]: filtered_num[0:10] 
Out[1]: [2, 3, 4, 5, 6, 8, 9, 20, 22, 23] 
1

except ist Teil eines speziellen Blocks try-except genannt. Dies ist ein Beispiel der Nutzung:

n = int(input()) 
try: 
    print(5 // n) 
except ZeroDivisionError: 
    print("You entered zero!") 

Also eigentlich, um Ihren Block angehoben Ausnahmen zu fangen, müssen Sie das Teil wickeln, die möglicherweise eine Ausnahme in einem try Block verursachen können und es mit einem oder mehrere except Blöcken folgen , wie folgt:

for num in group: 
    num_length = len(str(num)) 
    for i in range(num_length): 
     if str(num)[i] == '1' or str(num)[i] == '7': 
      try: 
       group.remove(num) 
      except ValueError: 
       pass 
     else: 
      pass 
1

Wenn Sie außer Sie auch versuchen müssen. Für detaillierte Informationen überprüfen Sie die documentation on error handling heraus.

Um zu überprüfen, ob sich ein Zeichen in einer Zeichenfolge befindet, können Sie auch das Schlüsselwort in verwenden.

Das Ändern einer Liste beim Iterieren kann merkwürdige Auswirkungen haben. Sie sollten also alle Zahlen, die Sie im ersten Lauf entfernen möchten, sammeln und dann über die Liste der zu entfernenden Zahlen iterieren und sie aus der Liste entfernen.

Zuletzt können Sie nicht aus einem Bereichsobjekt nur aus einer Liste entfernen, deshalb müssen Sie es in eins umwandeln. Der endgültige Code kann wie folgt aussehen:

group = list(range(1, 100)) 
to_remove = [] 

for num in group: 
    if '1' in str(num) or '7' in str(num):   
      to_remove.append(num) 

for num in to_remove: 
    try: 
     group.remove(num) 
    except ValueError: 
     pass 

print(group) 

Edit: Wie Donkey Kong wies darauf hin, es kann auch Pythons Liste Verständnis verwendet werden und prüft, ob 1 oder 7 in der Zahl ist erreicht werden kann, die Build mit -in jeder Funktion. Auf diese Weise ist es einfach, nach weiteren und anderen Ziffern zu suchen. Der der Code von Donkey Kong zur Verfügung gestellt sieht wie folgt aus:

group = [x for x in range(1, 100) if not any(s in str(x) for s in ['1', '7'])] 
print(group) 

Edit 2: Verwenden, wenn anstelle von jeder in der Liste Verständnis ist schneller. Dies wurde von juanpa.arrivillaga aufgezeigt. Hier ist sein der Code dafür:

group = [x for x in range(1,100) if not ('7' in str(x) or '3' in str(x))] 
print(group) 
+0

Wenn ich den Code mit direkt Entfernen von Elementen ausführen, anstelle von 'to_remove', jedes Mal, wenn eine Nummer entfernt wird, wird die folgende Nummer nicht überprüft. Die Filtermethode ist eine gute Alternative und ich füge sie meiner Antwort hinzu. – Leon

+0

Dieser Ansatz ist schneller: '[x für x im Bereich (1.100) falls nicht ('7' in str (x) oder '3' in str (x))] –

2

Zuerst range Objekte sind unveränderlich, was bedeutet, dass Sie nicht ein Element aus einem range Objekt entfernen können. Außerdem ist es jetzt möglich, Elemente aus einer Sequenz zu entfernen, über die Sie iterieren.

Zweitens, die except Block muss auf einen try Block verwandt werden, um den Code enthält, der den Fehler erzeugt wird, kann die mit dem except gefangen wird.

Ich schlage vor, Sie erstellen eine neue Liste mit den Elementen, die Sie behalten möchten (also ohne 1 und 7). Sie können auch die Prüfung auf Aufnahme von 1 und 7 mit dem Operator in vereinfachen.

group = range(1, 1001) 
data = [] 

for num in group: 
    s = str(num) 
    if not ('1' in s or '7' in s): 
     data.append(num) 

print(data) 
Verwandte Themen