2016-06-11 39 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 

我想刪除其中包含1或7位數字的數字。爲避免 "ValueError: list.remove(x): x not in list",我添加了"except ValueError: pass"。但是,我現在有"SyntaxError: invalid syntax"使用除ValueError外的語法錯誤?

回答

0

ValueError顯示您嘗試在列表中刪除的元素不存在於列表中。而且您必須使用tryexecpt。這就是爲什麼它顯示invalid syntax

try: 
    #Your action 
except ValueError: 
    pass 

但是你的問題可以像這樣實現。檢查過濾列表的前10個元素。

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是稱爲try-except特殊塊的一部分。這是使用的例子:

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

因此,爲了使你的模塊實際上趕上引發的異常,你需要用能可能導致異常的try塊中的一部分,並與一個或多個except塊跟進,像這樣:

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

如果你使用除了你還需要嘗試。有關詳細信息,請查看documentation on error handling

此外,要檢查字符是否在字符串中,您可以使用in關鍵字。

另外在迭代時更改列表可能會產生奇怪的效果。因此,您應該收集您想要在第一次運行中刪除的所有號碼,然後遍歷數字列表以從列表中刪除和刪除它們。

最後,你不能從一個範圍對象,只從一個列表中刪除,這就是爲什麼你必須把它變成一個。使用建設成爲金剛指出的那樣,它也可以使用蟒蛇列表理解和檢查,如果1或7的號碼做可以完成:最後的代碼可以是這個樣子:

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) 

編輯 - 在任何功能。這樣就很容易檢查更多和其他數字。該由金剛提供的代碼如下所示:

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

編輯2:如果不是列表中的任何理解更快使用。 juanpa.arrivillaga指出了這一點。下面是他對這個代碼:

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

當運行直接刪除元素,而不是使用'to_remove'代碼,每一個號碼被移除時,下面的數目不作檢查。過濾方法是一個很好的選擇,我將它添加到我的答案。 – Leon

+0

這種方法速度更快:如果不是('str'(x)'中的'7'或str(x)中的'3')'[x對於範圍x(1,100) –

2

首先,range對象是不可改變的,這意味着你不能從range對象中刪除元素。此外,現在可以從正在迭代的序列中刪除元素。

其次,except塊必須與包含代碼的try塊相關,該代碼可能會生成except捕獲的錯誤。

我建議你用你想要保留的元素(沒有1和7)創建一個新列表。您還可以使用in運算符來簡化包含1和7的檢查。

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)