【问题标题】:Python comparison operatorsPython 比较运算符
【发布时间】:2019-05-03 12:51:22
【问题描述】:

我有两个值,例如 a=972 和 b=11188。 我想从位于两个数字之间的制表符分隔的文本文件中获取所有条目的详细信息。 python 比较运算符 = 返回错误的结果。

我在 if 语句中使用了 <= 和 >= 运算符。

if l1[3]<="18188" >="900" and l1[2]=="1":

它什么也没返回。 当我写

if l1[3]<="18188":

它返回“18166 和 11188 作为输出”。理想情况下,这个 if 函数必须返回“11188 ,972 和 3632”。

这是制表符分隔的文件。

SRR6298199.1    16  1   3632    0   50M32S  *   0   0   AACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCC   !!""""!"!"!"!!"!!!""""""!!!""""!""  NM:i:1  AS:i:48 XS:i:47
SRR6298199.10   0   1   972 0   40M274S *   0   0   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAATTTGAA !"""'$""!"!"""" NM:i:0  AS:i:40 XS:i:40 XP:Z:3,+18166143,41S36M237S,0,0;
SRR6298199.10   0   1   18166   0   41S36M237S  *   0   0   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAATTT    !"""!#!#$#$"!""""   NM:i:0  AS:i:36 XS:i:34 XP:Z:2,+9723273,40M274S,0,0;
SRR6298199.11   16  1   11188   0   1841S9M *   0   0   GACCAGTATCGGGCCGGCATAAGCCTCGAATTTCACCAGCA   !!!!!!""!#!"%%&)(%-//.//,".,.+.-..&!    NM:i:18 AS:i:81 XS:i:81

这是完整的代码。请弄清楚为什么这段代码没有返回真实的结果。


# EXTRACTING THE DETAILS OF READS ALIGNED ON CHR_1 
fr=open("Sample.txt","r")
z=fr.read()
bz=z.split("\n")
temp1=[]
for bases in bz:
    temp1.append(bases.split("\t"))
cc1=[]
se=[] #READ NAMES ALIGNED ON CHR_1
chr2=[] #READ NAMES ALIGNED ON CHR_2
for l1 in temp1:
 if l1[3]<="18188" >="900" and l1[2]=="1":
     #print(l1[3])
        #cc1.append("@"+str(l1[0])+"\t"+"length="+str(len(l1[9]))+"\n"+l1[9]+"\n"+"+"+l1[0]+"\t"+"length="+str(len(l1[9]))+"\n"+l1[10])
    cc1.append("@"+str(l1[0])+" "+"/1"+"\n"+"+"+"\n"+l1[9])       
print(cc1)

我希望if l1[3]&lt;="18188" &gt;="900" and l1[2]=="1": 的输出是

['SRR6298199.1', '16', '1', '3632', '0', '50M32S', '*', '0', '0', 'AACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCC', '!!""""!"!"!"!!"!!!""""""!!!""""!""', 'NM:i:1', 'AS:i:48', 'XS:i:47']
['SRR6298199.10', '0', '1', '972', '0', '40M274S', '*', '0', '0', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAATTTGAA', '!"""\'$""!"!""""', 'NM:i:0', 'AS:i:40', 'XS:i:40', 'XP:Z:3,+18166143,41S36M237S,0,0;']
['SRR6298199.11', '16', '1', '11188', '0', '1841S9M', '*', '0', '0', 'GACCAGTATCGGGCCGGCATAAGCCTCGAATTTCACCAGCA', '!!!!!!""!#!"%%&)(%-//.//,".,.+.-..&!', 'NM:i:18', 'AS:i:81', 'XS:i:81']
['SRR6298199.10', '0', '1', '18166', '0', '41S36M237S', '*', '0', '0', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAATTT', '!"""!#!#$#$"!""""', 'NM:i:0', 'AS:i:36', 'XS:i:34', 'XP:Z:2,+9723273,40M274S,0,0;']

但前面提到的 if 语句返回 [],一个空列表

【问题讨论】:

  • l1[3]&lt;="18188" &gt;="900" 等价于l1[3]&lt;="18188" and "18188" &gt;="900"。 "18188" &gt;="900" 总是假的,所以这永远不会是真的。你想用这段代码测试什么条件?

标签: python-2.7 comparison-operators


【解决方案1】:

两个问题:

1) 你误用/误用了比​​较运算符

if l1[3]<= "18188" >="900" and l1[2]=="1":  # always false becase "1..." is never >= "9.."

应该是

if "900"<= l1[3] <="18188" and l1[2]=="1":

2) 您使用字典比较来比较数字 - 这将失败,因为在字典比较中 "9" 大于 "1111111"

您可以使用正确的比较语法和浮点值来修复这两个错误以进行比较:

if 900 <= float(l1[3]) <= 18188 and l1[2]=="1":

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多