我有一个Python脚本,它读入.csv文件并将每个值存储到列表列表中:list [x] [y]。我对此没有任何问题。
list = []
i = 0
for row in reader:
list.append([])
list[i].append(row[0])
...
i += 1
我想检查其中一个字段,看它是否是一个数字(整数)。
当我执行print type(list[i][0])
时,即使值为100,也会返回<type 'str'>
。
下面的if语句是在for
循环遍历列表,所以我想做的就是检查:
if type(list[i][0] == types.IntType):
True
else:
False
这是有效的,但是在PEP8中这是令人不悦的,因此我应该使用isinstance()
,因此我将其修改为
# check if a value is entered
if list[i][0] != '':
if isinstance(int(list[i][0]), int):
True
else:
False
else
False
但我遇到了尝试将字符串转换为int(如果用户输入字符串)的问题。
我如何克服这个问题?这似乎是一个简单的问题,但我是Python的新手,所以我想知道一个简洁有效的方法来解决这个问题。在将值存入列表之前,我应该检查值是否为int?
我正在使用Python2。
由于
编辑:我已经将isinstance()
检查包围在一个try异常捕获中但是我觉得我不应该只是为了检查某些东西是否为int?只是好奇是否有更简洁的方法来做到这一点。
编辑:我之前提到的isdigit
使用过,但是我得到了负面结果。
即。给出这个数据集。 list [0] [0] = 123,list [1] [0] = asdasd
for i in range(0, 1):
if (list[i][0]).isdigit:
tempInt = list[i][0]
print type(tempInt)
print 'True: ' + tempInt
else:
tempInt = 1
print 'False: ' + tempInt
结果:
<type 'str'>
True: 123
<type 'str'>
True: asdasd
答案 0 :(得分:1)
你可以用它来检查 - 这适用于所有数字(正整数,负整数,浮点数,南数),仅适用于int
或某些子类,可能存在更好的方法。
def is_number(a):
# will be True also for 'NaN'
try:
number = float(a)
return True
except ValueError:
return False
面值,看起来不太好。但我认为这可能是最好的方法,如果你想考虑所有数字(负数,浮点数,整数,无穷大等),你可以看到一个高度观点/投票的问题/答案here。另请注意,isdigit
并非在所有情况下都有效。
答案 1 :(得分:0)
以下方法仅返回整数:
string_list = ['20.0', '100', 'abc', '10.3445', 'adsfasdf.adsfasdf', '10,3445', '34,0']
def check(inp):
try:
inp = inp.replace(',', '.')
num_float = float(inp)
num_int = int(num_float)
return num_int == num_float
except ValueError:
return False
print([check(s) for s in string_list])
,并提供:
[True, True, False, False, False, False, True]
诀窍是首先将字符串转换为浮点数并将其转换为整数(如果小数部分不为零,则将循环浮点数)。之后,您可以比较输入的整数和浮点表示,以确定输入是否为整数。
我添加了.replace()
以便使用逗号支持欧洲和美国/英国十进制表示法。