Python中的不同输出

Python中的不同输出,python,Python,我想删除字符串(“324a”包括在内),并在列表中只保留整数。这是代码 a = ["345", "sadas", "324a", "14", "john"] for i in a: try: if i == int(i): continue except ValueError: a.remove(i) print(

我想删除字符串(“324a”包括在内),并在列表中只保留整数。这是代码

a = ["345", "sadas", "324a", "14", "john"]
    

for i in a:
    try:
        if i == int(i):
            continue
    except ValueError:
        a.remove(i)
print(a)
使用此代码,输出为

['345', '324a', '14']
即使“324a”不是整数,并且代码应该返回ValueError,但代码仍然不会将其从列表中删除


下面是另一个简单代码,显示“324a”不是整数

a = "324a"
a = int(a)
print(a)
上述代码的输出

a = int(a)
ValueError: invalid literal for int() with base 10: '324a'

提前感谢您的回答

这与您在遍历列表时对列表进行变异有关

查看下面的代码并查看打印的索引…删除索引1处的
sadas
,现在索引1处保留
324a
,但循环无法识别值更改,因此在迭代过程中不会重复索引1两次

for idx, i in enumerate(a):
    print(idx)
    try:
        if i == int(i):
            continue
    except ValueError:
        a.remove(i)
print(a)
试一试-


这与您在遍历列表时对列表进行变异有关

查看下面的代码并查看打印的索引…删除索引1处的
sadas
,现在索引1处保留
324a
,但循环无法识别值更改,因此在迭代过程中不会重复索引1两次

for idx, i in enumerate(a):
    print(idx)
    try:
        if i == int(i):
            continue
    except ValueError:
        a.remove(i)
print(a)
试一试-

您不能在遍历列表时从列表中删除项目。
另外,当
i
str
时,以下语句将是
False
i==int(i)

我建议改用这个:

a = ["345", "sadas", "324a", "14", "john"]
tempList = []
for i in a:
    try:
        int(i)
        tempList.append(i) # if int(i) fails, this line won't be reached
    except ValueError:
        pass

a = tempList[:] # we use [:] to copy the list
print(a)
或者这一行:

a = ["345", "sadas", "324a", "14", "john"]
print([int(x) for x in a if x.isdigit()])
您不能在遍历列表时从列表中删除项目。
另外,当
i
str
时,以下语句将是
False
i==int(i)

我建议改用这个:

a = ["345", "sadas", "324a", "14", "john"]
tempList = []
for i in a:
    try:
        int(i)
        tempList.append(i) # if int(i) fails, this line won't be reached
    except ValueError:
        pass

a = tempList[:] # we use [:] to copy the list
print(a)
或者这一行:

a = ["345", "sadas", "324a", "14", "john"]
print([int(x) for x in a if x.isdigit()])

不要修改正在迭代的列表。创建一个新的,如下所示:

a = list(filter(None, map(lambda x: x if x.isdigit() else None, a)))
a = [word for word in a if word.isdigit()]
编辑:从评论中,我们可以直接使用
str.isdigit
过滤器

a = list(filter(str.isdigit, a)))

不要修改正在迭代的列表。创建一个新的,如下所示:

a = list(filter(None, map(lambda x: x if x.isdigit() else None, a)))
a = [word for word in a if word.isdigit()]
编辑:从评论中,我们可以直接使用
str.isdigit
过滤器

a = list(filter(str.isdigit, a)))

您可以使用如下简单的列表理解:

a = list(filter(None, map(lambda x: x if x.isdigit() else None, a)))
a = [word for word in a if word.isdigit()]

这将创建一个包含所有数字的列表。

您可以使用如下简单的列表理解:

a = list(filter(None, map(lambda x: x if x.isdigit() else None, a)))
a = [word for word in a if word.isdigit()]


这将创建一个包含所有数字的列表。

顺便说一句,整个if语句是不需要的,也没有真正意义。您可以使用
int(i)
。另外,欢迎使用SO!看看and.BTW,整个if语句是不需要的,也没有真正意义。您可以使用
int(i)
。另外,欢迎使用SO!检查and。是的,在对列表进行迭代时从列表中删除会导致问题。谢谢你的澄清!是的,当在列表上迭代时从列表中删除会导致问题。谢谢你的澄清!我可以在迭代时从列表中删除项目,但这个过程会弄乱索引。原因如下:我可以在迭代时从列表中删除项,但这个过程会弄乱索引。原因如下:我喜欢这样,但有几点可以改进:1)使用else子句使try子句尽可能小。2) 函数名不要使用大写字母,请使用snake_大小写或至少使用小写字母。3) 当您可以直接测试函数结果时,
isInt
是不必要的。4) 使用理解或过滤器而不是循环要简单一些。有了这些变化,谢谢@wjandreaNice!另外,我忘了提到,添加一个简短的代码工作原理解释会有帮助,比如一两句话。我喜欢这样,但有几点可以改进:1)使用else子句使try子句尽可能小。2) 函数名不要使用大写字母,请使用snake_大小写或至少使用小写字母。3) 当您可以直接测试函数结果时,
isInt
是不必要的。4) 使用理解或过滤器而不是循环要简单一些。有了这些变化,谢谢@wjandreaNice!我还忘了提到,添加一个简短的代码工作原理解释会有帮助,比如一两句话。说
list(filter(str.isdigit,a))
是的,
filter
当然可以直接接受
str.isdigit
作为参数。谢谢要说
list(filter(str.isdigit,a))
是的,
filter
当然可以直接接受
str.isdigit
作为它的参数。谢谢