我正在使用l=['1','2','3','rt4','rt5']
作为输入,我使用以下代码将其转换为l=[1,2,3,'rt4','rt5']
:
def RepresentsInt(s):
try:
int(s)
return True
except ValueError:
return False
l=['1','2','3','rt4','rt5']
l=[int(l[i]) if RepresentsInt(l[i]) else l[i] for i in range(0,len(l))]
我可以使用理解来改进上面的代码吗?
答案 0 :(得分:3)
目前还不清楚你想要什么,但也许是这样的:
>>> l=['1','2','3','rt4','rt5']
>>> l=[int(i) if i.isdigit() else i for i in l]
>>> l
[1, 2, 3, 'rt4', 'rt5']
答案 1 :(得分:3)
您可以更改RepresentsInt
函数以实际返回整数(如果可能),这将使这更容易:
def RepresentsInt(s):
try:
return int(s)
except ValueError:
return s
然后可以将用于转换列表的代码写为(使用for item in l
循环可能比迭代索引更好):
>>> l = ['1','2','3','rt4','rt5']
>>> [RepresentsInt(item) for item in l]
[1, 2, 3, 'rt4', 'rt5']
或者,如果你想将它作为一个可重用的模式,你仍然需要一个辅助函数(我在这里选择了类似装饰器的方法),因为你不能在理解中使用try
和/或except
:
def try_to_apply_func(func, exception):
def newfunc(value):
try:
return func(value)
except exception:
return value
return newfunc
>>> to_int_if_possible = try_to_apply_func(int, ValueError)
>>> [to_int_if_possible(item) for item in l]
[1, 2, 3, 'rt4', 'rt5']
>>> to_float_if_possible = try_to_apply_func(float, ValueError)
>>> [to_float_if_possible(item) for item in l]
[1.0, 2.0, 3.0, 'rt4', 'rt5']
答案 2 :(得分:0)
我不相信(尽管我最终可能错了)有一种更清洁,更简洁的方法来实现这一目标。一种解决方案是创建一个整数解析lambda
表达式,如下所示,但我认为您当前的解决方案更整洁,更强大。
>>> l = ['1','2','3','rt4','rt5']
>>> l = list(map(lambda s : (s.isdigit() or (s[0] == '-' and s[1:].isdigit())) and int(s) or s, l))
>>> l
[1, 2, 3, 'rt4', 'rt5']
这将无法正确捕捉'1.0'
或' 1'
等字符串,但它应该只是在两行中执行您想要的操作。
答案 3 :(得分:0)
您可以使用以下代码获得所需的结果。
Thread(target=start_method, args=(xxxxxxxxx, )).start()