Python的isdigit()方法为负数返回False

时间:2013-03-30 15:27:40

标签: python integer

我有一个文本文件,我读到列表。该列表包含整数和字符串。

例如,我的列表可能如下所示:

["name", "test", "1", "3", "-3", "name" ...]

现在,我想使用.isdigit()方法或isinstance()函数将所有数字转换为整数。 例如:

for i in range len(mylist):
    if mylist[i].isdigit():
        mylist[i] =  int(mylist[i])

问题是"-3".isdigit()例如会返回False。有关解决问题并将负数字字符串转换为负整数的简单解决方案的任何提示吗?

3 个答案:

答案 0 :(得分:8)

该方法仅测试位数-不是数字。如果要检测整数,则需要使用int()进行测试并捕获ValueError异常:

for i, value in enumerate(mylist):
    try:
        mylist[i] = int(value)
    except ValueError:
        pass  # not an integer

换句话说,不需要进行明确测试;只需转换并捕获异常。请求原谅,而不是要求许可。

答案 1 :(得分:1)

尝试一下,如果失败则捕获异常:

try:
    return int(obj)
except ValueError:
    ...

Python采用的视图,比请求更容易请求宽恕。在你跳跃之前寻找通常更慢,更难阅读,并且经常会引入竞争条件(不是在这种情况下,而是一般)。

此外,像这样在原地修改列表是一个坏主意,因为在Python中通过索引访问很慢。相反,请考虑使用这样的list comprehension

def intify(obj):
    try:
        return int(obj)
    except ValueError:
        return obj

mylist_with_ints = [intify(obj) for obj in mylist]

这使得新列表具有修改后的值,并且更具可读性和效率。

作为一个注释,由于我们只是将一个函数应用于列表的每个项目,map()在这里也可以正常工作:

mylist_with_ints = map(intify, mylist)

请注意,如果您需要列表而不是3.x中的iterable,则需要在list()中包装地图调用。

答案 2 :(得分:1)

转换为整数的方法是尝试转换并为其失败做好准备:

for i in range(len(mylist)):
    try:
        mylist[i] = int(mylist[i])
    except ValueError:
        pass