鱼C论坛

 找回密码
 立即注册
查看: 802|回复: 9

[已解决]count函数咨询

[复制链接]
发表于 2023-12-1 10:42:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
文件“测试.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次呢
最佳答案
2023-12-1 13:10:09
你这里单查exon  肯定是8个啊   你要查前后都有空格的 就是4个了

>>> len(re.findall("exon",ts))
8
>>> len(re.findall(" exon ",ts))
4
>>>
jg.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-1 10:42:55 | 显示全部楼层
问题出在你的循环中,当找到匹配的行时,你将整行添加到了字符串`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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 10:54:12 | 显示全部楼层
FishC_GPT 发表于 2023-12-1 10:42
问题出在你的循环中,当找到匹配的行时,你将整行添加到了字符串`st`中。然而,在GFF文件中,属性信息是以 ...

分号(;)分隔为什么会导致计数重复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 10:54:30 | 显示全部楼层
大盒子 发表于 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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 11:00:32 | 显示全部楼层
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’分别是怎么数出来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 11:00:52 | 显示全部楼层
大盒子 发表于 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([exon for exon in exons if exon.strip() != ''])
   
    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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 13:10:09 | 显示全部楼层    本楼为最佳答案   
你这里单查exon  肯定是8个啊   你要查前后都有空格的 就是4个了

>>> len(re.findall("exon",ts))
8
>>> len(re.findall(" exon ",ts))
4
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-1 14:05:01 | 显示全部楼层
wp231957 发表于 2023-12-1 13:10
你这里单查exon  肯定是8个啊   你要查前后都有空格的 就是4个了

>>> len(re.findall("exon",ts))

计数8个的时候,背后是什么逻辑咧?请大神展开讲讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 16:12:59 From FishC Mobile | 显示全部楼层
大盒子 发表于 2023-12-1 14:05
计数8个的时候,背后是什么逻辑咧?请大神展开讲讲

这就是所谓的模糊查找和精准查找的区别
比如查找dog
那么,ddog算不算?dogg算不算??
ddogg算不算???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-2 13:15:10 | 显示全部楼层
wp231957 发表于 2023-12-1 16:12
这就是所谓的模糊查找和精准查找的区别
比如查找dog
那么,ddog算不算?dogg算不算??

原来如此,感谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表