有没有一种方法可以判断一个字符串是否表示一个整数(例如'3'
,'-17'
但不是'3.14'
或'asfasfas'
),而不使用try / except机制?
is_int('3.14') == False
is_int('-7') == True
有没有一种方法可以判断一个字符串是否表示一个整数(例如'3'
,'-17'
但不是'3.14'
或'asfasfas'
),而不使用try / except机制?
is_int('3.14') == False
is_int('-7') == True
import ast
def is_int(s):
return isinstance(ast.literal_eval(s), int)
安全地评估表达式节点或包含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
¯\_(ツ)_/¯
我猜这个问题与速度有关,因为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)
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的解决方案更快。
嗯...试试这个:
def int_check(a):
if int(a) == a:
return True
else:
return False
如果您没有输入一个不是数字的字符串,这段代码就可以正常工作。
另外(我忘记加入检查数字的部分了),还有一个函数可以检查字符串是否为数字。它是str.isdigit()。以下是一个示例:
a = 2
a.isdigit()
a
的值2
周围加上引号。 - Luke Woodwardint_check("ardvark")
@grasshopper int_check("ardvark")
- ctrl-alt-delor