鱼C论坛

 找回密码
 立即注册
查看: 1009|回复: 10

[已解决]我想用两个for循环找到两个txt文本中某列数值相近的列可是只跑了一下就停止了

[复制链接]
发表于 2020-4-10 14:34:19 | 显示全部楼层 |阅读模式
1鱼币
%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
for Line1 in chr1.readlines():
    try:
        line1 = Line1.strip().split('\t')
        for Line2 in chr2.readlines():
            try:
                line2=Line2.strip().split('\t')
                if (abs(int(line1[1])-int(line2[1]))<50) and (line1[0]==line2[0]):
                    dictcvrcvs[line1[0]]=line1[1]
                    i+=1
                    break
            except IndexError:
                z+=1
                continue
   
    except IndexError:
        z+=1
        continue

dictcvrcvs
{'chr11': '3125133'}
按理说应该有很多怎么会停了呢t
最佳答案
2020-4-10 14:34:20
你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问题都是空的,解决方法很简单,把文件2的readlines()先赋值给一个变量,然后对这个变量进行迭代:
%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
chr1_lines=chr1.readlines()      #先把结果赋值给变量,1号文件不是必须,但是为了统一整齐……
chr2_lines=chr2.readlines()      #这个是必须的,不能每次循环都做一次这个动作
chr1.close()                     #内容都导出来了,记得关文件
chr2.close()
for Line1 in chr1_lines:
    try:
        line1 = Line1.strip().split('\t')
        for Line2 in chr2_lines:               #对列表进行迭代,就不会有空的了
            try:
                line2=Line2.strip().split('\t')
                if (abs(int(line1[1])-int(line2[1]))<50) and (line1[0]==line2[0]):
                    dictcvrcvs[line1[0]]=line1[1]
                    i+=1
                    break
            except IndexError:
                z+=1
                continue
   
    except IndexError:
        z+=1
        continue

最佳答案

查看完整内容

你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问题都是空的,解决方法很简单,把文件2的readlines()先赋值给一个变量,然后对这个变量进行迭代:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 14:34:20 | 显示全部楼层    本楼为最佳答案   
你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问题都是空的,解决方法很简单,把文件2的readlines()先赋值给一个变量,然后对这个变量进行迭代:
%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
chr1_lines=chr1.readlines()      #先把结果赋值给变量,1号文件不是必须,但是为了统一整齐……
chr2_lines=chr2.readlines()      #这个是必须的,不能每次循环都做一次这个动作
chr1.close()                     #内容都导出来了,记得关文件
chr2.close()
for Line1 in chr1_lines:
    try:
        line1 = Line1.strip().split('\t')
        for Line2 in chr2_lines:               #对列表进行迭代,就不会有空的了
            try:
                line2=Line2.strip().split('\t')
                if (abs(int(line1[1])-int(line2[1]))<50) and (line1[0]==line2[0]):
                    dictcvrcvs[line1[0]]=line1[1]
                    i+=1
                    break
            except IndexError:
                z+=1
                continue
   
    except IndexError:
        z+=1
        continue
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 14:39:18 | 显示全部楼层
因为里层循环中的readlines使用一次后文件指针已经指向末尾,其实chr2再用readlines读出的是None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-10 14:46:05 | 显示全部楼层
BngThea 发表于 2020-4-10 14:39
因为里层循环中的readlines使用一次后文件指针已经指向末尾,其实chr2再用readlines读出的是None

我把这个删了也不行啊,我感觉还是这个指针的问题,现在我还没有太明白,那怎么改一下可以呢?用feek(0)?

%%time
z=0
i=0
dictcvrcvs={}
chr1 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_R-48h/c vs Rresult.txt', 'r')
chr2 = open('/Users/guoshuyu/Downloads/DMR_info/CG/control_vs_S-48h/c vs Sresult.txt', 'r')
for Line1 in chr1:
    try:
        line1 = Line1.strip().split('\t')
        for Line2 in chr2:
            try:
                line2=Line2.strip().split('\t')
                if (abs(int(line1[1])-int(line2[1]))<10000) and (line1[0]==line2[0]):
                    dictcvrcvs[line1[0]]=line1[1]
                    i+=1
                    break
            except IndexError:
                z+=1
                continue
   
    except IndexError:
        z+=1
        continue
        
chr1.close()
chr2.close()

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 14:52:36 | 显示全部楼层
郭书宇 发表于 2020-4-10 14:46
我把这个删了也不行啊,我感觉还是这个指针的问题,现在我还没有太明白,那怎么改一下可以呢?用feek(0 ...

把它单独读出来,再去遍历
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-10 15:57:58 | 显示全部楼层
txxcat 发表于 2020-4-10 14:34
你的代码的问题是,在遍历文件1每一行的时候,文件2都会readlines()一次,但是除了第一次,后面由于指针问 ...

可是这个有没有别的好方法,感觉这个代码效率太低了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-10 15:59:49 | 显示全部楼层
BngThea 发表于 2020-4-10 14:52
把它单独读出来,再去遍历

sorry我把最佳答案给人家了,毕竟咱俩认识给人家脸生的了,我其实看你答案跑出来了,有没有改进一下这个代码的方法,这个感觉跑的好慢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 16:22:32 | 显示全部楼层
郭书宇 发表于 2020-4-10 15:57
可是这个有没有别的好方法,感觉这个代码效率太低了

看样子你的两个文件都不小,所以运行起来速度不快,看你的代码,每行内容的第一部分不会重复,所以你可以把文件2的数据先转成字典,这样查找起来比遍历一遍列表要快很多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-10 17:16:27 | 显示全部楼层
txxcat 发表于 2020-4-10 16:22
看样子你的两个文件都不小,所以运行起来速度不快,看你的代码,每行内容的第一部分不会重复,所以你可以 ...

我明白你的意思啦=了,可是字典为啥比列表快呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-10 17:44:51 | 显示全部楼层
郭书宇 发表于 2020-4-10 17:16
我明白你的意思啦=了,可是字典为啥比列表快呢

百度了一下:
因为字百典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也叫散列表),根据关度键值对(Key-value)而直接进行访问的数据结知构。它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,道更新也快。而这个映射函数叫做哈回希函数,存放值的数组叫做哈希表。答 哈希函数的实现方式决定了哈希表的搜索效率。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-13 15:39:15 | 显示全部楼层
txxcat 发表于 2020-4-10 17:44
百度了一下:
因为字百典是通过键来索引的,关联到相对的值,理论上他的查询复杂度是O(1)。
哈希表(也 ...

哦明白了,我确实拿那个跑了一下,字典确实快了很多,一会就能出结果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 10:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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