理解中的压缩功能

2024-10-17 06:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我以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))]  

我能用理解来改进上面的代码吗?在


Tags: 代码falsetrueforreturnifdefelse
3条回答

您可以使用以下代码来获得所需的结果。在

l = ['1','2','3','rt4','rt5']
l = [int(each) if each.isdigit() else each for each in l]
print l

您可以更改您的RepresentsInt函数,以实际返回整数(如果可能),这样做会更容易:

def RepresentsInt(s):
    try: 
        return int(s)
    except ValueError:
        return s

然后转换列表的代码可以写成(使用for item in l循环可能比迭代索引要好):

^{pr2}$

或者,如果您希望作为可重用的模式,您仍然需要一个helper函数(我在这里选择了一种类似于decorator的方法),因为您不能在理解中使用try和/或{}:

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']

现在还不清楚你想要什么,但可能是:

>>> l=['1','2','3','rt4','rt5']
>>> l=[int(i) if i.isdigit() else i for i in l]
>>> l
[1, 2, 3, 'rt4', 'rt5']

相关问题 更多 >