如何编写含两个IF判断的Python列表推导式实现补零操作?
如何将带顺序条件的循环转为Python列表推导式?
首先看你原来的循环代码:
x = ['3', '15', '161', '2', '4113', '26', '1141', '00', '05', '02', '064'] c = [] for i in x: if len(i) <= 2: i = '00' + i if len(i) <= 3: i = '0' + i c.append(i)
你当前尝试的列表推导式写法是错误的:
['00' + i for i in x if len(i) <= 2 if len(i) <= 3]
因为推导式末尾的if是过滤条件,只会保留同时满足两个条件的元素(也就是长度≤2的元素),然后给它们加00,完全不符合原循环的逻辑——原循环是对所有元素依次做两次修改,不管是否满足条件都要加入结果列表,不是过滤元素。
正确的列表推导式写法
要实现原循环的顺序条件修改,需要把条件判断作为元素修改逻辑的一部分,而不是过滤条件。可以用嵌套的条件表达式来实现:
['0' + ('00' + i if len(i) <= 2 else i) if len('00' + i if len(i) <= 2 else i) <= 3 else ('00' + i if len(i) <= 2 else i) for i in x]
如果你的Python版本是3.8及以上,还可以用赋值表达式让代码更简洁易读:
['0' + temp if len(temp) <= 3 else temp for i in x for temp in ['00' + i if len(i) <= 2 else i]]
逻辑说明
原循环的本质是两步处理:
- 先检查元素长度≤2,是则在前面加
00,得到临时值temp - 再检查
temp的长度≤3,是则在前面加0,最终把处理后的值加入列表
上面的列表推导式就是把这两步逻辑用表达式的方式整合进去,确保每个元素都经过这两次判断处理,而不是被过滤。
内容的提问来源于stack exchange,提问作者ViciOus CircLe
相关产品推荐
相关产品推荐

