使用除ValueError之外的语法错误?

时间:2016-06-11 07:31:29

标签: python python-3.x python-3.5

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"

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:1)

如果您使用除了您还需要尝试。有关详细信息,请查看documentation on error handling

此外,要检查字符是否在字符串中,您可以使用in关键字。

另外,在迭代它时更改列表会产生奇怪的效果。因此,您应该在第一次运行中收集要删除的所有数字,然后迭代数字列表以删除并从列表中删除它们。

最后你无法从一个范围对象中删除,只能从列表中删除,这就是你必须把它变成一个的原因。最终的代码看起来像这样:

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)

编辑:正如Donkey Kong指出的那样,它也可以使用pythons列表理解来完成,并检查数字中是否有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)

编辑2:使用if而不是列表中的任何理解更快。这是由juanpa.arrivillaga指出的。这是他的代码:

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

答案 3 :(得分: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]