Python检查列表项是否为整数?
我有一个列表,其中包含字符串格式的数字和字母Python检查列表项是否为整数?,python,string,list,integer,Python,String,List,Integer,我有一个列表,其中包含字符串格式的数字和字母 mylist=['1','orange','2','3','4','apple'] 我需要列出一个新的列表,其中只包含数字: mynewlist=['1','2','3','4'] 如果我有办法检查列表中的每个项目是否可以转换为整数,我应该能够通过如下操作得出我想要的结果: for item in mylist: if (check item can be converted to integer): mynewlist.
mylist=['1','orange','2','3','4','apple']
我需要列出一个新的列表,其中只包含数字:
mynewlist=['1','2','3','4']
如果我有办法检查列表中的每个项目是否可以转换为整数,我应该能够通过如下操作得出我想要的结果:
for item in mylist:
if (check item can be converted to integer):
mynewlist.append(item)
如何检查字符串是否可以转换为整数?或者有更好的方法吗?试试这个:
mynewlist = [s for s in mylist if s.isdigit()]
从:
str.isdigit()
如果字符串中的所有字符都是数字且至少有一个字符,则返回true,否则返回false
对于8位字符串,此方法依赖于区域设置
如注释中所述,
isdigit()
返回的True
不一定表示可以通过int()
函数将字符串解析为int,返回的False
不一定表示不能解析。尽管如此,上述方法应该适用于您的情况。快速、简单,但可能并不总是正确的:
>>> [x for x in mylist if x.isdigit()]
['1', '2', '3', '4']
如果您需要获取数字,请使用更传统的方式:
new_list = []
for value in mylist:
try:
new_list.append(int(value))
except ValueError:
continue
注意:结果包含整数。如果需要,将它们转换回字符串,
将上面的行替换为:
try:
new_list.append(str(int(value)))
您可以使用异常处理,因为
str.digit
只适用于整数,也可能会失败:
>>> str.isdigit(' 1')
False
使用生成器功能:
def solve(lis):
for x in lis:
try:
yield float(x)
except ValueError:
pass
>>> mylist = ['1','orange','2','3','4','apple', '1.5', '2.6']
>>> list(solve(mylist))
[1.0, 2.0, 3.0, 4.0, 1.5, 2.6] #returns converted values
或者你想要这个:
def solve(lis):
for x in lis:
try:
float(x)
return True
except:
return False
...
>>> mylist = ['1','orange','2','3','4','apple', '1.5', '2.6']
>>> [x for x in mylist if solve(x)]
['1', '2', '3', '4', '1.5', '2.6']
或者使用ast.literal\u eval
,这将适用于所有类型的数字:
>>> from ast import literal_eval
>>> def solve(lis):
for x in lis:
try:
literal_eval(x)
return True
except ValueError:
return False
...
>>> mylist=['1','orange','2','3','4','apple', '1.5', '2.6', '1+0j']
>>> [x for x in mylist if solve(x)]
['1', '2', '3', '4', '1.5', '2.6', '1+0j']
检查某个东西是否可以转换为
int
的常用方法是尝试它,然后按照以下原则查看:
try:
int_value = int(string_value)
except ValueError:
# it wasn't an int, do something appropriate
else:
# it was an int, do something appropriate
因此,在你的情况下:
for item in mylist:
try:
int_value = int(item)
except ValueError:
pass
else:
mynewlist.append(item) # or append(int_value) if you want numbers
在大多数情况下,围绕一些以mynewlist.append(item)
结尾的琐碎代码的循环可以转换为列表理解、生成器表达式或调用map
或过滤器
。但是在这里,你不能,因为除了在表达式中插入一个之外,没有其他方法可以将try
/
但如果将其封装在函数中,则可以:
def raises(func, *args, **kw):
try:
func(*args, **kw)
except:
return True
else:
return False
mynewlist = [item for item in mylist if not raises(int, item)]
…或者,如果您愿意:
mynewlist = filter(partial(raises, int), item)
这样使用更干净:
def raises(exception_types, func, *args, **kw):
try:
func(*args, **kw)
except exception_types:
return True
else:
return False
通过这种方式,您可以将期望的异常(或异常元组)传递给它,这些异常将返回True
,但如果引发任何意外异常,它们将传播出去。因此:
mynewlist = [item for item in mylist if not raises(ValueError, int, item)]
…会做你想做的,但是:
mynewlist = [item for item in mylist if not raises(ValueError, item, int)]
…将引发一个TypeError
,这是应该的。值得注意的是str.isdigit()
将返回True
,在通过int()
时会抛出异常,而在某些不会抛出异常的情况下返回False
。例如:上标数字,“+1”@Lattyware您能举一个可能导致异常的值的例子吗?“²”-上标数字2。它从str.isdigit()
返回True
,但int(“²”)
将抛出值错误。相反,“+1”
解析很好,但是str.isdigit(“+1”)
将返回False
@Lattyware显然负整数也是如此。@当然,这种情况很多,我只举了两个简单的例子。注意,它的行为与OP所说的不同——OP将列表中的元素显示为字符串。也就是说,在大多数情况下,这可能是最好的答案。另外,float()
的使用可能是好的,但是如果询问者只想要整数值,int()
是合适的。但是如果您想忽略作为字符串“123”的数字,例如,当前您包括它们,该怎么办