Python代码块中列表推导式的工作机制及‘if i’逻辑原理咨询
关于列表推导式中
if i的工作逻辑 咱们一步步拆解这个问题,先搞懂re.split带捕获组的行为,再看if i到底在做什么:
1. re.split带捕获组的拆分特点
当你用re.split且正则表达式包含捕获组(括号包裹的部分)时,它会把匹配到的分隔符也放进拆分结果里。但有个容易忽略的细节:如果匹配的模式出现在字符串的开头或结尾,拆分结果里会多出空字符串。
拿你的例子来看:
用
r'([A-Za-z]+)'拆分'125km':import re s = '125km' re.split(r'([A-Za-z]+)', s) # 实际结果:['125', 'km', '']因为
km是字符串的末尾,匹配到它之后后面没有内容了,所以会多出一个空字符串''。用
r'(\d+)'拆分'125km':re.split(r'(\d+)', s) # 实际结果:['', '125', 'km']这次
125在字符串开头,匹配到它之前没有内容,所以开头会多出一个空字符串''。
2. if i的过滤逻辑
在Python里,空字符串''属于假值(布尔判断时为False),而非空的字符串(比如'125'、'km')是真值(布尔判断时为True)。
所以列表推导式里的if i,本质就是:只保留布尔值为True的元素,自动过滤掉那些没用的空字符串,最终得到干净的['125', 'km']。
简单说,if i等价于if i != ''或者if bool(i),只是写法更简洁。
反例验证(去掉if i的效果)
如果删掉if i,你就能直观看到那些空字符串:
[i for i in re.split(r'([A-Za-z]+)', s)] # 结果:['125', 'km', ''] [i for i in re.split(r'(\d+)', s)] # 结果:['', '125', 'km']
这时候就更能体会if i的作用——把这些冗余的空字符串剔除掉。
内容的提问来源于stack exchange,提问作者Pythonner12
相关产品推荐
相关产品推荐

