首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于负数,Python的isdigit()方法返回False

对于负数,Python的isdigit()方法返回False
EN

Stack Overflow用户
提问于 2013-03-30 23:27:40
回答 3查看 3.1K关注 0票数 0

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

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

代码语言:javascript
运行
复制
["name", "test", "1", "3", "-3", "name" ...]

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

代码语言:javascript
运行
复制
for i in range len(mylist):
    if mylist[i].isdigit():
        mylist[i] =  int(mylist[i])

问题是,例如,"-3".isdigit()会返回False。有什么建议可以简单地解决这个问题并将负数字字符串转换为负整数吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-30 23:29:02

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

代码语言:javascript
运行
复制
for i, value in enumerate(mylist):
    try:
        mylist[i] = int(value)
    except ValueError:
        pass  # not an integer

换句话说,不需要显式测试;只需转换并捕获异常即可。请求宽恕而不是请求许可。

票数 9
EN

Stack Overflow用户

发布于 2013-03-30 23:29:39

尝试一下,并在失败时捕获异常:

代码语言:javascript
运行
复制
try:
    return int(obj)
except ValueError:
    ...

Python认为请求宽恕比请求许可更容易。三思而后行通常更慢、更难读,而且通常会引入竞争条件(不是在这种情况下,而是在一般情况下)。

而且,像这样就地修改列表也不是一个好主意,因为在Python中通过索引访问是很慢的。相反,可以考虑使用如下所示的list comprehension

代码语言:javascript
运行
复制
def intify(obj):
    try:
        return int(obj)
    except ValueError:
        return obj

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

这将创建一个具有修改后的值的新列表,并且更具可读性和效率。

需要注意的是,由于我们只是将一个函数应用于列表中的每一项,因此map()在这里也可以很好地工作:

代码语言:javascript
运行
复制
mylist_with_ints = map(intify, mylist)

请注意,如果您在3.x中需要一个列表而不是一个迭代器,那么您将需要将映射调用包装在list()中。

票数 0
EN

Stack Overflow用户

发布于 2013-03-30 23:29:57

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

代码语言:javascript
运行
复制
for i in range(len(mylist)):
    try:
        mylist[i] = int(mylist[i])
    except ValueError:
        pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15720176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档