Python:"尝试"内部缩短为...循环

时间:2015-11-19 10:09:29

标签: python loops try-catch shortcut

假设我想将字符串列表转换为整数,但不能对所有元素进行。

我知道这有效:

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

谢谢!

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

3 个答案:

答案 0 :(得分:3)

无法在列表理解中使用try/except子句,但这可能有所帮助:

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

输出:

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

更新(问题已更新):

这可能会有所帮助,但我不知道使用它有多好/准确:

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]

答案 1 :(得分:0)

试试这个。

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

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

答案 2 :(得分:0)

如果您想将try-except压缩成一行,我认为答案是,并在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']