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。
我会混合使用 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']
假设我想将字符串列表转换为整数,但无法对所有元素完成此操作。
我知道这行得通:
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。
我会混合使用 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']