如何用Python单行代码实现不等式乘整数反转符号?TBLASTN序列提取场景
嘿,这个想法挺有意思的!不过直接用 (start_codon <= coord <= stop_codon)*strand 作为判断条件是行不通的——因为在Python里,布尔值True等价于1,False等价于0,乘以strand后,结果要么是1/-1(原条件为真时),要么是0(原条件为假时)。而if语句会把所有非零值都视为True,这就意味着不管strand是1还是-1,只要原正链条件成立就会进入分支,完全达不到你想要的负链反转判断的效果。
不过别担心,我们可以用两种方式实现你要的单行判断逻辑:
方法1:利用三元表达式(直观易懂)
直接根据strand的值切换判断条件,写法非常清晰:
if (start_codon <= coord <= stop_codon) if strand == 1 else (stop_codon <= coord <= start_codon): # 执行你的操作
方法2:利用乘法反转不等式(符合你最初的数学思路)
根据不等式乘负数反转方向的数学规则,我们可以把整个判断的三个值都乘以strand,这样就能统一正负链的判断逻辑:
if (start_codon * strand) <= (coord * strand) <= (stop_codon * strand): # 执行你的操作
原理很简单:
- 当
strand=1时,表达式等价于原正链条件start_codon <= coord <= stop_codon; - 当
strand=-1时,表达式变为-start_codon <= -coord <= -stop_codon,两边同时乘以-1(反转不等号)后,就等价于start_codon >= coord >= stop_codon,也就是你需要的负链判断条件。
举个例子验证:假设start_codon=1,stop_codon=6:
- 当
strand=1、coord=3时,1*1 <=3*1 <=6*1→1<=3<=6,条件成立; - 当
strand=-1、coord=0时,1*-1 <=0*-1 <=6*-1→-1 <=0 <=-6?不对,哦应该对应负链的有效区间是6<=coord<=1(假设这是业务定义的负链范围),当coord=6时,1*-1 <=6*-1 <=6*-1→-1 <=-6 <=-6,条件成立,正好匹配负链的判断需求。
这两种单行写法都能满足你的需求,根据自己的喜好选择就行~
内容的提问来源于stack exchange,提问作者Kevin Correia
相关产品推荐
相关产品推荐

