python - 使用列表理解最佳表达式删除前导零的问题
问题描述
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)): 表达式的一部分在做什么感到困惑?
解决方案
该表达式在列表中查找第一个非零值,返回剩余的列表。更多细节在底部。
分析
但是,您有字符:列表中没有整数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
运算符接管:它获取非零的第一个索引并将其返回给切片运算符(注意末尾的冒号),切片运算符返回列表的其余部分。
如前所述pault
,len
末尾的 是默认值:如果您的零过滤器取消了整个列表的资格(全为零),那么理解返回len(result)
到next
. 这意味着next
将返回列表长度,并且您的result
切片返回一个空列表。 现在您的or表达式在第一个操作数中有一个“Falsy”值;它返回第二个操作数 list ['0']
。
推荐阅读
- sql-server - 为什么在存储过程中使用或从 SSMS 或 DBeaver 运行查询时查询结果不同
- javascript - 顶级等待不适用于节点 14.13.-
- javascript - 如何更改对 Firestore 的调用以减少读取请求?
- ffmpeg - FFmpeg HLS 选择流并仅检索其数据
- string - 按顺序将映射元素添加到切片
- arrays - 代码在我的 ide 中运行良好,但在 GeeksforGeeks 上提交后没有得到输出
- batch-file - 使用路径变量时 Forfiles 复制失败
- c# - xml 和 xsd 的架构验证失败
- angular - ag-grid-community:服务器端分页的无限行模型,社区免费版 agGrid - 不像服务器端分页那样工作
- c++ - 为什么我需要重新声明重载的虚函数?