假设我想将字符串列表转换为整数,但不能对所有元素进行。
我知道这有效:
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
谢谢!
编辑:抱歉,我也在谈论浮点数。我刚刚更改了我的示例数据
答案 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处回答。
我会使用regex
和isinstance
混合检查 - 它会捕获所有数字类型,例如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']