在理解中压缩功能

时间:2017-08-29 10:40:53

标签: python list list-comprehension

我正在使用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))]  

我可以使用理解来改进上面的代码吗?

4 个答案:

答案 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()