2017-10-17 92 views
-1

我在这里看到了各种答案,但没有一个回答我的问题。我想下面的列表将字符串列表转换为可能的整数

list = ['A', '2', '8', 'B', '3'] 

转换为以下几点:

list = ['A', 2, 8, 'B', 3] 

我想保持串为字符串,但是转换字符串整数如果可能的话。

我知道我可以做这样的事情:

list = [int(i) for i in list] 

如果只是数字,但我不确定如何做到这一点时,它是混合的。

+2

最好不要阴影保留的名称像'list'。 –

回答

2

您可以使用str.isdigit()

>>> l = ['A', '2', '8', 'B', '3'] 
>>> [int(x) if x.isdigit() else x for x in l] 
['A', 2, 8, 'B', 3] 

以负数到:

>>> l = ['A', '2', '8', 'B', '-3'] 
>>> [int(x) if x.isdigit() or x.startswith('-') and x[1:].isdigit() else x for x in l] 
>>> ['A', 2, 8, 'B', -3] 
+3

这对于负数不起作用。 – wds

+2

@ wds的例外是你为什么一般比[LBYL]更喜欢[EAFP](https://docs.python.org/3/glossary.html#term-eafp)模式(https://docs.python.org/3 /glossary.html#term-lbyl);尝试做你想做的事情,如果失败则处理异常。不要试图编写一个解析器来预先检查你的条件(你每次都会错过一个边缘案例),只要这样做,并适当地处理失败。 'int()'知道如何解析,不要重新发明轮子。仅供参考,'int'还允许任意的前导和尾随空格; 'int('-2')'完全合法,但会失败'isdigit'测试。 – ShadowRanger

3

总是有try/except

oldlist = ['A', '2', '8', 'B', '3'] 
newlist = [] 
for x in oldlist: 
    try: 
     newlist.append(int(x)) 
    except ValueError: 
     newlist.append(x) 

newlist 
# ['A', 2, 8, 'B', 3] 
1

我只想提取转化成功能。

def int_if_possible(value): 
    try: 
     return int(value) 
    except (ValueError, TypeError): 
     return value 

int_list = [int_if_possible(i) for i in int_list] 

此外,我将您的列表重命名为int_list,以便我们仍然可以使用列表构造函数(如果需要)。

+0

为了概括起来,你可能想要做'except(ValueError,TypeError):',所以你不要在不能成为'int'的类型上(例如'list','tuple'等等)。如果'list'全部是'str','ValueError'就没问题,但如果它是混合类型的,并且只想转换类似int的'str'而不改变其他东西,那么处理TypeError会让你感觉到。 – ShadowRanger

+0

听起来很公平。该问题仅提及整数或字符串,因此实施者应该知道哪一个是合适的。我已经更新了我的答案,因为它使得该功能在这种情况下更加灵活。 – Shadow

0

您可以使用尝试,除块

lst1 = ['A', '2', '8', 'B', '3'] 
lst2 = [] 
for i in lst1: 
    try: 
     lst2.append(int(i)) 
    except ValueError: 
     lst2.append(i) 

print lst2