Python :从列表中删除不可转换为 int 的项目的干净有效的方法

Python : Clean and efficient way to remove items that are not convertable to int from list

我有一个这样的列表:

mylist = [1.0,2.0,3.0,4.0,...,u'*52', u'14*', u'16*',"", "" ,"",...]

基本上包含floatunicodesblank(string?)。 (它也可以有其他数据类型)

我的 objective 是从列表中删除任何不能转换为整数的项目。

我试过这样使用 .isdigit()

newlist= [i for i in mylist if i.isdigit()]

但我最终得到了 AttributeError:

AttributeError: 'float' object has no attribute 'isdigit'

什么是干净整洁的方法(不使用太多 if/else 或 try/except 子句)来实现这一点?

我正在使用 python 2.7

您可以使用辅助函数:

def convertible(v):
    try:
        int(v)
        return True
    except (TypeError, ValueError):
        return False

newlist = [i for i in mylist if convertible(i)]

试试下面的代码:

mylist = [1.0,2.0,3.0,4.0,u'*52', u'14*', u'16*']
newlst=[]
for i in mylist:
    try:
        newlst.append(int(i))
    except ValueError:

        pass
print newlst

对于您的示例列表,这可以应用,"without using too many if/else or try/except clauses"

>>>[i for i in mylist if isinstance(i, (int, float))]
[1.0, 2.0, 3.0, 4.0]
from numbers import Number

mylist = [1.0,2.0,3.0,4.0,u'*52', u'14*', u'16*',"", "" ,""]

mylist[:] = [ele for ele in mylist if isinstance(ele,Number)]

print(mylist)

为什么你得到 AttributeError: 'float' object has no attribute 'isdigit' 是因为 isdigit 是一个 str 方法,你试图在一个实际的浮点数上调用它。

mylist[:] 更改原始列表,它可能是您想要的,也可能不是您想要的,如果您想保留两者,只需使用 newlist= ....