Python中"YNEOS"切片判断反转字符串的代码逻辑疑问
问题场景
在字符串校验场景中,规则为:程序接收用户输入的两个字符串s、t,若t是s的反转字符串则输出YES,否则输出NO。
基础实现
常规写法逻辑清晰,运行结果符合预期,代码如下:
s = input() t = input() if t == s[::-1]: print("YES") else: print("NO")
极简代码原理
这段一行写法是把Python的几个语法特性组合到了一起,逐部分拆解就很容易懂:
print("YNEOS"[input()!=input()[::-1]::2])
核心前置规则
- Python里布尔类型是整型的子类:
False和整数0完全等价,True和整数1完全等价,可以直接当索引值使用。 - Python序列切片规则为
[起始位置:结束位置:步长],省略结束位置时默认取到序列末尾;步长为2时,会从起始位置开始每隔1个字符取一个值。 - 比较运算符两侧的表达式严格从左到右求值,不会出现右侧先计算的情况。
- 对字符串做
[::-1]切片就是返回字符串的反转结果,和基础写法里的用法完全一致。
逐段逻辑拆解
- 先看判断部分:
input()!=input()[::-1]- 先执行左侧第一个
input(),读取第一行输入(对应基础写法里的s) - 再执行右侧的
input()[::-1]:先读取第二行输入(对应基础写法里的t),紧接着把t反转 - 做不等判断:这里注意
t == s[::-1]和s == t[::-1]是完全等价的(等式两边同时反转即可推导,反转两次就会回到原字符串),不存在输入顺序错乱的问题。如果两个值不相等(即t不是s的反转串),判断结果为True(对应整数1);如果两个值相等(即t是s的反转串),判断结果为False(对应整数0)。
- 先执行左侧第一个
- 再看外层字符串切片:
"YNEOS"[判断结果::2]
先把字符串"YNEOS"的索引和对应字符列出来:索引 0 1 2 3 4 字符 Y N E O S - 当判断结果为
False(即0,匹配输出YES的场景):切片规则是[0::2],从索引0开始步长为2取到末尾,拿到的字符是索引0的Y、索引2的E、索引4的S,拼接结果就是YES - 当判断结果为
True(即1,匹配输出NO的场景):切片规则是[1::2],从索引1开始步长为2取到末尾,拿到的字符是索引1的N、索引3的O,拼接结果就是NO
- 当判断结果为
整段代码没有特殊技巧,只是把常规写法里的分支判断、结果映射全部用Python的语法糖压缩到了一行里。
内容的提问来源于stack exchange,提问作者Anonymous Stranger
相关产品推荐
相关产品推荐

