首页 > 解决方案 > 使用列表理解最佳表达式删除前导零的问题

问题描述

result是一个数字列表:

result = ['0','5','0','1']

我想使用以下表达式删除前导零:

result = result[next((i for i, x in enumerate(result)
                if x != 0), len(result)):] or [0]

我的问题有两个:

1.)我不理解表达式,因为它是
2.)表达式不起作用:它不会删除任何零(前导或其他)

我希望列表理解能够删除每个零,而不仅仅是前导的。我也对 len(result)): 表达式的一部分在做什么感到困惑?

标签: python

解决方案


该表达式在列表中查找第一个非零值,返回剩余的列表。更多细节在底部。

分析

但是,您有字符:列表中没有整数0。因此,表达式仅返回原始列表。

解决方案

如果您希望它适用于字符,只需包含所需的引号:

result[next((i for i, x in enumerate(result) if x != '0'), len(result)):] or ['0']

这给你:

原始代码:

>>> result = ['0','5','0','1']
>>> result[next((i for i, x in enumerate(result) if x != 0), len(result)):] or [0]
['0', '5', '0', '1']

适应字符串/字符:

>>> result[next((i for i, x in enumerate(result) if x != '0'), len(result)):] or ['0']
['5', '0', '1']
>>> result = ['0','0','5','0','1']
>>> result[next((i for i, x in enumerate(result) if x != '0'), len(result)):] or ['0']
['5', '0', '1']
>>> result = ['7', '0','0','5','0','1']
>>> result[next((i for i, x in enumerate(result) if x != '0'), len(result)):] or ['0']
['7', '0', '0', '5', '0', '1']

表达逻辑

关键从句位于理解的最深处:

(i for
    i, x in enumerate(result)
        if x != '0')

enumerate子句中,i, x遍历列表索引及其内容:(0, '0')(1, '5')等。

if检查零字符;它过滤掉所有零。在内部子句找到非零之前,该i for部分不会获得任何值。i

此时外部next运算符接管:它获取非零的第一个索引并将其返回给切片运算符(注意末尾的冒号),切片运算符返回列表的其余部分。

如前所述paultlen末尾的 是默认值:如果您的零过滤器取消了整个列表的资格(全为零),那么理解返回len(result)next. 这意味着next将返回列表长度,并且您的result切片返回一个空列表。 现在您的or表达式在第一个操作数中有一个“Falsy”值;它返回第二个操作数 list ['0']


推荐阅读