存在多级嵌套if条件时如何正确实现列表推导式(list comprehension)
核心循环转列表推导式实现
你给出的内层拼接s3的循环可以直接用列表推导式+字符串join方法改写,改写后的代码如下:
s3 = ''.join([ # 最内层判断:字符是否为z(ascii 122),是则返回a(ascii97),否则字符编码+1 chr(97) if ord(current_char) == 122 else chr(ord(current_char) + 1) # 遍历索引 for i in range(len(s1)) # 外层判断:索引为偶数取s1的对应字符,奇数取s2的对应字符 for current_char in [s1[i] if i % 2 == 0 else s2[i]] ])
如果追求更精简的写法,也可以直接嵌套三元表达式,不需要额外定义current_char临时变量:
s3 = ''.join(chr(97) if ord(s1[i] if i%2==0 else s2[i]) == 122 else chr(ord(s1[i] if i%2==0 else s2[i]) + 1) for i in range(len(s1)))
嵌套if-else在列表推导式中的使用规则
混淆的核心是要分清两种if的使用场景:
- 如果你要过滤掉不符合条件的元素:把if写在for循环的后面,不需要写else
- 如果你要根据不同条件返回不同的值:把if-else以三元表达式
返回值1 if 条件 else 返回值2的形式写在for循环的前面,多层分支直接按原生if的逻辑嵌套三元表达式即可
完整改写后的代码
s1 = input() s2 = input() n = int(input()) lst = [] for i in range(n): # 直接用列表推导式生成s3 s3 = ''.join([ chr(97) if ord(c) == 122 else chr(ord(c) + 1) for i in range(len(s1)) for c in [s1[i] if i%2 ==0 else s2[i]] ]) lst.append(s3) s1, s2 = s2, s3 print(lst[n-3])
内容的提问来源于stack exchange,提问作者blaze
相关产品推荐
相关产品推荐

