如何在不使用try/except的情况下检查一个字符串是否表示一个整数?

717

有没有一种方法可以判断一个字符串是否表示一个整数(例如'3''-17'但不是'3.14''asfasfas'),而不使用try / except机制?

is_int('3.14') == False
is_int('-7')   == True

28
为什么要“费力地”这样做?用try/except有什么问题吗? - S.Lott
8
是的,使用try/except有什么问题?宁愿请求宽恕,也不要征得许可。 - mk12
82
我会问为什么这个简单的事情需要使用try/except?异常系统是一个复杂的东西,但这只是一个简单的问题。 - Aivar
18
@Aivar停止散播恐慌情绪。一个try/except块甚至都不算“复杂”。 - Kenan Banks
68
这并不是真正的FUD。你实际上要编写4行代码,期望某些东西会出错,捕获异常并执行默认操作,而不是使用一行代码。 - andersonvom
显示剩余11条评论
23个回答

0
我建议如下:
import ast

def is_int(s):
    return isinstance(ast.literal_eval(s), int)

docs中:

安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,字节,数字,元组,列表,字典,集合,布尔值和None。

我应该注意到,当针对任何不构成Python文字的东西进行调用时,这将引发一个 ValueError 异常。由于问题要求一种不使用try/except的解决方案,因此我有一种类似于Kobayashi-Maru类型的解决方案:

from ast import literal_eval
from contextlib import suppress

def is_int(s):
    with suppress(ValueError):
        return isinstance(literal_eval(s), int)
    return False

¯\_(ツ)_/¯


1
使用Python 3.8版本运行您的“Kobayashi-Maru”代码时,对于输入如“'123abc'”这样的字符串仍会出现异常 - “SyntaxError:unexpected EOF while parsing”。 - user9645

-1

我猜这个问题与速度有关,因为try/except会有时间惩罚:

测试数据

首先,我创建了一个包含200个字符串的列表,其中100个是失败的字符串,另外100个是数字字符串。

from random import shuffle
numbers = [u'+1'] * 100
nonumbers = [u'1abc'] * 100
testlist = numbers + nonumbers
shuffle(testlist)
testlist = np.array(testlist)

numpy解决方案(仅适用于数组和Unicode)

np.core.defchararray.isnumeric也可以与Unicode字符串一起使用np.core.defchararray.isnumeric(u'+12'),但它返回一个数组。因此,如果您需要进行数千次转换并且存在缺失数据或非数字数据,则这是一个很好的解决方案。

import numpy as np
%timeit np.core.defchararray.isnumeric(testlist)
10000 loops, best of 3: 27.9 µs per loop # 200 numbers per loop

尝试/除非

def check_num(s):
  try:
    int(s)
    return True
  except:
    return False

def check_list(l):
  return [check_num(e) for e in l]

%timeit check_list(testlist)
1000 loops, best of 3: 217 µs per loop # 200 numbers per loop

看起来numpy的解决方案更快。


-4

嗯...试试这个:

def int_check(a):
    if int(a) == a:
        return True
    else:
        return False

如果您没有输入一个不是数字的字符串,这段代码就可以正常工作。

另外(我忘记加入检查数字的部分了),还有一个函数可以检查字符串是否为数字。它是str.isdigit()。以下是一个示例:

a = 2
a.isdigit()

如果你调用 a.isdigit(),它会返回 True。

我认为你需要在赋值给a的值2周围加上引号。 - Luke Woodward
6
检查一个字符串是否表示一个整数,不使用 Try/Except? - jfs
@grasshopper int_check("ardvark") @grasshopper int_check("ardvark") - ctrl-alt-delor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接