count函数咨询
文件“测试.txt”中的内容如下:GWHAOPM00000765 EVM gene 45928 49103 . + 0 ID=OeCYP51G64a;Accession=GWHGAOPM050481; ;transl_table=1
GWHAOPM00000765 EVM mRNA 45928 49103 . + 0 ID=OeCYP51G64a.1;Accession=GWHTAOPM050481;Parent=OeCYP51G64a;Parent_Accession=GWHGAOPM050481; ;transl_table=1
GWHAOPM00000765 EVM exon 45928 46049 . + 0 ID=Contig001288_ERROPOS3153804__exon_45928_46049;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;;transl_table=1
GWHAOPM00000765 EVM CDS 45928 46049 . + 0 ID=Contig001288_ERROPOS3153804__CDS_45928_46049;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;Protein_Accession=GWHPAOPM050481;;transl_table=1
GWHAOPM00000765 EVM exon 46433 46542 . + 0 ID=Contig001288_ERROPOS3153804__exon_46433_46542;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;;transl_table=1
GWHAOPM00000765 EVM CDS 46433 46542 . + 1 ID=Contig001288_ERROPOS3153804__CDS_46433_46542;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;Protein_Accession=GWHPAOPM050481;;transl_table=1
GWHAOPM00000765 EVM exon 46575 46801 . + 0 ID=Contig001288_ERROPOS3153804__exon_46575_46801;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;;transl_table=1
GWHAOPM00000765 EVM CDS 46575 46801 . + 2 ID=Contig001288_ERROPOS3153804__CDS_46575_46801;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;Protein_Accession=GWHPAOPM050481;;transl_table=1
GWHAOPM00000765 EVM exon 48105 49103 . + 0 ID=Contig001288_ERROPOS3153804__exon_48105_49103;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;;transl_table=1
GWHAOPM00000765 EVM CDS 48105 49103 . + 0 ID=Contig001288_ERROPOS3153804__CDS_48105_49103;Parent=OeCYP51G64a.1;Parent_Accession=GWHTAOPM050481;Protein_Accession=GWHPAOPM050481;;transl_table=1
文件“测试1.txt”中的内容如下:
OeCYP51G64a
代码如下:
a = open('.\\测试.txt')
b = open('.\\测试1.txt')
c = open('.\\数量1.txt','w')
gff = a.readlines()
cyp = b.readlines()
shul = ['CYPname\texon\tintron\n']
for i in cyp:
d = ''
st = ''
p450 = i.strip()
for m in gff:
if p450 in m:
st += m
d = p450 + '\t' + str(st.count('exon')/2) + '\t' +str(st.count('exon')/2-1) + '\n'
print(st)
print(st.count('exon'))
print(st.count('exon')/2)
assert 3>4
shul.append(d)
c.writelines(shul)
a.close()
b.close()
c.close()
问题:文件“测试.txt”中明明‘exon’出现的次数只有4次,为什么会被count成8次呢 问题出在你的循环中,当找到匹配的行时,你将整行添加到了字符串`st`中。然而,在GFF文件中,属性信息是以分号(;)分隔的,所以你可能会得到重复的结果。
为了解决这个问题,你可以使用split(';')方法来提取属性信息,并对每个属性进行处理。修改你的代码如下:
a = open('.\\测试.txt')
b = open('.\\测试1.txt')
c = open('.\\数量1.txt', 'w')
gff = a.readlines()
cyp = b.readlines()
shul = []
for i in cyp:
d = ''
st = ''
p450 = i.strip()
for m in gff:
if p450 in m:
attrs = m.strip().split(';')# 将属性信息以分号分隔成列表
for attr in attrs:
if 'exon' in attr:
st += attr + '\n'
d = p450 + '\t' + str(st.count('exon')/2) + '\t' +str(st.count('exon')/2-1) + '\n'
shul.append(d)
c.writelines(shul)
a.close()
b.close()
c.close()
现在,`st`中只包含与'exon'相关的属性行,而不再包含其他属性行。重新运行代码,你应该会得到正确的结果。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 FishC_GPT 发表于 2023-12-1 10:42
问题出在你的循环中,当找到匹配的行时,你将整行添加到了字符串`st`中。然而,在GFF文件中,属性信息是以 ...
分号(;)分隔为什么会导致计数重复 大盒子 发表于 2023-12-01 10:54
分号(;)分隔为什么会导致计数重复
当你将`m`中的行按照分号(;)进行分割后,得到的是一个属性列表。如果某个属性中包含了关键字'exon',那么通过count方法计算得到的结果可能会多于实际的'exon'出现次数。这是因为'exon'可能在属性中出现多次,而count方法会将每次出现都计数。
例如,假设属性列表为`['ID=Contig001288_ERROPOS3153804__exon_45928_46049', 'Parent=OeCYP51G64a.1', 'Parent_Accession=GWHTAOPM050481', '', 'transl_table=1']`,其中第一个属性即为'exon'。如果使用count方法计算'exon'的出现次数,会得到2,但实际上只有一个'exon'。
为了避免重复计数,你可以使用set数据结构来存储'exon',这样每个'exon'只会被计算一次。修改代码如下所示:
a = open('.\\测试.txt')
b = open('.\\测试1.txt')
c = open('.\\数量1.txt', 'w')
gff = a.readlines()
cyp = b.readlines()
shul = []
for i in cyp:
d = ''
exons = set()# 使用set存储'exon'
p450 = i.strip()
for m in gff:
if p450 in m:
attrs = m.strip().split(';')
for attr in attrs:
if 'exon' in attr:
exons.add(attr)# 将'exon'添加到set中
d = p450 + '\t' + str(len(exons)) + '\t' + str(len(exons)-1) + '\n'
shul.append(d)
c.writelines(shul)
a.close()
b.close()
c.close()
现在,计算'exon'的次数时,只会计算不重复的'exon',避免了重复计数的问题。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 FishC_GPT 发表于 2023-12-1 10:54
当你将`m`中的行按照分号(;)进行分割后,得到的是一个属性列表。如果某个属性中包含了关键字'exon',那 ...
在你举的例子中,
例如,假设属性列表为`['ID=Contig001288_ERROPOS3153804__exon_45928_46049', 'Parent=OeCYP51G64a.1', 'Parent_Accession=GWHTAOPM050481', '', 'transl_table=1']`,其中第一个属性即为'exon'。如果使用count方法计算'exon'的出现次数,会得到2,但实际上只有一个'exon'。
count方法分别是以怎样的标准计算了2次‘exon’,或者说,它计算的2个‘exon’分别是怎么数出来的
大盒子 发表于 2023-12-01 11:00
在你举的例子中,
例如,假设属性列表为``,其中第一 ...
非常抱歉,我之前的回答有误。count方法并不会将每次'exon'出现都计数两次。实际上,问题出在你的代码中重复使用了exon关键字。
在你的代码中,`st.count('exon')/2` 这一行计算了'exon'出现的次数。然后你又在后续的代码中打印了`st.count('exon')`来查看计数结果。
然而,问题是你在构建字符串`st`时,并没有将'exon'作为整个属性进行计数,而是将每个属性包含'exon'的部分都计数了。这就导致了错觉,认为计数结果多了一倍。
为了解决这个问题,你可以对每个属性进行判断,只统计属性中是否包含关键字'exon',而不对属性的内容进行计数。修改你的代码如下:
a = open('.\\测试.txt')
b = open('.\\测试1.txt')
c = open('.\\数量1.txt', 'w')
gff = a.readlines()
cyp = b.readlines()
shul = []
for i in cyp:
d = ''
st = ''
p450 = i.strip()
for m in gff:
if p450 in m:
attrs = m.strip().split(';')
for attr in attrs:
if 'exon' in attr:
st += attr + '\n'
exons = st.split('\n')
exon_count = len()
d = p450 + '\t' + str(exon_count) + '\t' +str(exon_count-1) + '\n'
shul.append(d)
c.writelines(shul)
a.close()
b.close()
c.close()
现在,我对每个属性进行了判断,在构建字符串`st`时只统计是否包含'exon'关键字的属性,而不是对属性内容进行计数。通过这种方式,你应该可以得到正确的计数结果。再次对之前的误导表示歉意。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 你这里单查exon肯定是8个啊 你要查前后都有空格的 就是4个了
>>> len(re.findall("exon",ts))
8
>>> len(re.findall(" exon ",ts))
4
>>>
wp231957 发表于 2023-12-1 13:10
你这里单查exon肯定是8个啊 你要查前后都有空格的 就是4个了
>>> len(re.findall("exon",ts))
计数8个的时候,背后是什么逻辑咧?请大神展开讲讲 大盒子 发表于 2023-12-1 14:05
计数8个的时候,背后是什么逻辑咧?请大神展开讲讲
这就是所谓的模糊查找和精准查找的区别
比如查找dog
那么,ddog算不算?dogg算不算??
ddogg算不算??? wp231957 发表于 2023-12-1 16:12
这就是所谓的模糊查找和精准查找的区别
比如查找dog
那么,ddog算不算?dogg算不算??
原来如此,感谢大神
页:
[1]