Python: "Try" 内部缩短的 for...循环

Python: "Try" inside shortened for...loop

假设我想将字符串列表转换为整数,但无法对所有元素完成此操作。

我知道这行得通:

a = ['2.0','3.0','4.0','5.0','Cherry']
b = []

for k in a:
    try:
        int(k)
        b.append(int(k))
    except:
        pass

print b
> [2, 3, 4, 5]

但是还有更短的方法吗?我想到了类似的东西:

b = [try int(k) for k in a]

这听起来像是一个愚蠢的问题,因为我确实有一个可行的解决方案,但我经常看到用更短的方法来做同样的事情,并且总是很感激这种帮助。我正在使用 Python 2.7

谢谢!

编辑:抱歉,我也在谈论浮点数。我刚刚更改了示例数据

无法在 List Comprehensions 中使用 try/except 子句,但这可能会有所帮助:

a = ['2','3','4','5','Cherry']
print [int(x) for x in a if x.isdigit()]

输出:

['2', '3', '4', '5']

Update (as the question was updated):

这可能会有帮助,但我不知道 good/accurate 如何使用它:

a = ['2.0','3.0','4.0','5.0', '44545.45', 'Cherry']

[float(x) for x in a if x.split('.')[0].isdigit() and x.split('.')[1].isdigit()]

输出:

[2.0, 3.0, 4.0, 5.0, 44545.45]

试试这个。

def is_number(k):
    try:
        float(k)
    except ValueError:
        return False
    return True

[int(float(k)) for k in a if is_number(k)]

如果你想将 try-except 压缩成一行,那么我认为答案是 NO,答案是 here。 我会混合使用 regexisinstance 检查 - 它捕获所有数字类型,例如float、long、int 和 complex-

>>>a=['2', '3', '4', '5', 'Cherry', '23.3', '-3']
>>>filter(bool,[i if isinstance(eval(i),(int, long, float, complex)) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)])
>>>['2', '3', '4', '5', '23.3', '-3']

如果只想捕获floats-

>>>filter (bool,[i if isinstance(eval(i),float) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)])
>>>['23.3']

如果只想捕获int-

>>>filter (bool,[i if isinstance(eval(i),int) else None for i in filter(lambda x: re.findall(r'[-+]?\d+[\.]?\d*',x),a)])
>>>['2', '3', '4', '5', '-3']