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”的数字,例如,当前您包括它们,该怎么办