2016-06-11 2 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 показывает, что элемент, который вы пытаетесь удалить из списка, не существует в списке. И вы должны использовать try и execpt. Вот почему это показывает 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.

Кроме того, чтобы проверить, есть ли символ в строке, вы можете использовать ключевое слово.

Кроме того, изменение списка при повторении по нему может иметь странные эффекты. Поэтому вы должны собрать все номера, которые хотите удалить в первом прогоне, а затем перебрать список номеров, чтобы удалить и удалить их из списка.

Последнее, что вы не можете удалить из объекта диапазона, только из списка, поэтому вы должны превратить его в один. Окончательный код может выглядеть примерно так:

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: Как Donkey Kong отметил, что также может быть сделано с помощью списка питоны понимания и проверки, если 1 или 7 в количестве может быть осуществлено с использованием сборки - в любой функции. Таким образом, легко проверить и другие цифры. Код предоставляется Donkey Kong выглядит следующим образом:

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

Edit 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

Этот подход выполняется быстрее: '[x для x в диапазоне (1,100), если нет ('7' в str (x) или '3' в str (x))]' –

2

Во-первых, range объекты являются неизменными, а значит, вы не можете удалить элемент из range объекта. Более того, теперь можно удалить элементы из последовательности, которую вы итерируете.

Во-вторых, блок except должен быть связан с блоком try, содержащим код, который может вызвать ошибку, которая была обнаружена с помощью except.

Я предлагаю вам создать новый список с элементами, которые вы хотите сохранить (то есть без 1 и 7 в нем). Вы также можете упростить проверку на включение 1 и 7 с помощью оператора in.

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) 
Смежные вопросы