Python 变量类型检查
我有一个包含字符串的列表。这些字符串可以是单词,也可以是整数值。例如,此列表可能如下所示:Python 变量类型检查,python,python-2.7,Python,Python 2.7,我有一个包含字符串的列表。这些字符串可以是单词,也可以是整数值。例如,此列表可能如下所示: ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3'] 现在,根据它们的类型(整数或字符串),我想对它们进行不同的处理。但是,正如您所注意到的,我不能使用isinstace()。我仍然可以使用type()并尝试使用int()函数转换整数值,然后将整个过程放入try-except方法中,以避免在转换单词时出现错误。但这对我来说似乎有点刻薄。你知道处理这个案子的正确方法
['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']
现在,根据它们的类型(整数或字符串),我想对它们进行不同的处理。但是,正如您所注意到的,我不能使用
isinstace()
。我仍然可以使用type()
并尝试使用int()
函数转换整数值,然后将整个过程放入try-except方法中,以避免在转换单词时出现错误。但这对我来说似乎有点刻薄。你知道处理这个案子的正确方法吗?提前谢谢 我会采取不同的方法。如果你知道所有可能的“特殊”词,检查一下这些词。其他所有内容都必须是int:
keywords = {'Negate', 'SPECIALCASE'}
tmp = []
for i in lis:
if i in keywords:
tmp.append(i)
else
tmp.append(int(i))
当然,如果您不想转换而接受INT以外的任何东西,那么尝试转换并退回到未转换的使用是一种方法。我会采取不同的方法。如果你知道所有可能的“特殊”词,检查一下这些词。其他所有内容都必须是int:
keywords = {'Negate', 'SPECIALCASE'}
tmp = []
for i in lis:
if i in keywords:
tmp.append(i)
else
tmp.append(int(i))
当然,如果你想接受除INT以外的任何东西而不进行转换,那么尝试转换并退回到未转换的用途是一条可行之路。一种“不要请求许可,请求原谅”的python方式:
请注意,如果您希望列表中只有少数项目是“特殊”案例项目,则应该这样做。否则,按照@doomster建议进行检查 一种“不要请求许可,请求原谅”的python方式:
请注意,如果您希望列表中只有少数项目是“特殊”案例项目,则应该这样做。否则,按照@doomster建议进行检查 这里有一个正则表达式方法供参考。这可能太过分了
mylist = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']
import re
p = re.compile(r'-?\d+')
[p.match(e) is not None for e in mylist]
# returns [True, False, True, True, False, True]
这将返回一个带有True
的列表,该列表适用于任意以-
开头,然后包含一个或多个数字的字符串<对于任何其他字符串,代码>False
或者,如果您不需要列表,只想执行不同的操作:
for item in mylist:
if p.match(item):
# it's a number
else:
# it's a string
由于
None
(即不匹配)的计算结果为False
,而其他任何内容(涉及正则表达式匹配时)的计算结果为True
,因此上述方法有效。如果希望更明确,可以使用如果p.match(item)不是None:
作为参考,这里有一个regex方法。这可能太过分了
mylist = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']
import re
p = re.compile(r'-?\d+')
[p.match(e) is not None for e in mylist]
# returns [True, False, True, True, False, True]
这将返回一个带有True
的列表,该列表适用于任意以-
开头,然后包含一个或多个数字的字符串<对于任何其他字符串,代码>False
或者,如果您不需要列表,只想执行不同的操作:
for item in mylist:
if p.match(item):
# it's a number
else:
# it's a string
由于
None
(即不匹配)的计算结果为False
,而其他任何内容(涉及正则表达式匹配时)的计算结果为True
,因此上述方法有效。如果您想更明确,可以使用如果p.match(item)不是None:
您可以使用类型转换来检查它是整数还是字符串
def is_integer(input):
try:
int(input)
return True
except:
return False
for item in ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']:
if is_integer(item):
...
else:
...
您可以使用类型转换来检查它是整数还是字符串
def is_integer(input):
try:
int(input)
return True
except:
return False
for item in ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']:
if is_integer(item):
...
else:
...
“尝试使用int()函数转换整数值”-这是一种方法,或者使用正则表达式…实现这一点的最佳方法在很大程度上取决于您希望最终结果是什么,您希望如何处理
'-3'
?这应该是一个int
?如果您的2.45
是字符串还是数字?是否应将其转换为浮点
或整数
?除非你想进行逐位检查,否则最好的方法应该是try/except。你说你想根据类型对它们进行不同的处理,但这是你真正想要的吗?Python不是为类型检查而设计的,它是作为duck类型语言设计的。根据对象是否可以执行操作而不是它的类型来执行操作。“尝试使用int()函数转换整数值”-这就是方法,或者使用正则表达式…执行此操作的最佳方法在很大程度上取决于您希望最终结果是什么,您希望如何处理'-3'
?这应该是一个int
?如果您的2.45
是字符串还是数字?是否应将其转换为浮点
或整数
?除非你想进行逐位检查,否则最好的方法应该是try/except。你说你想根据类型对它们进行不同的处理,但这是你真正想要的吗?Python不是为类型检查而设计的,它是作为duck类型语言设计的。根据对象是否可以执行操作,而不是对象的类型,执行您想要的操作。+1,如果可能,这是一个很好的方法(尽管如果关键字非常少,则可能是次优的)。然而,列表的构建可以简化为:tmp=[i if i in keywords else int(i)for i in lis]
+1,如果可能的话,这是一种很好的方法(尽管如果关键字非常罕见,它可能是次优的)。但是,列表的构建可以简化为:tmp=[i if i in keywords else int(i)for i in lis]
不要使用except
而不指定异常,它可以隐藏错误并使问题极难发现。不要使用except
而不指定异常,它可以隐藏bug,使发现问题变得极其困难。