免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 12027 | 回复: 29
打印 上一主题 下一主题

求教字符串快速比较问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-01 15:30 |只看该作者 |倒序浏览
求教各位大虾 字符串比较问题:

随意两个长度相同的字符串:
”AATTCCCCCGCGATCGGTTTTT"
"AATTCCCCCGCGATCGGTTATT"
如果字符串只有一个字符不对就保留,其他的放弃
由于是一百多万个字符串和另外一百多万个个比较。我本来期望用a这样一个一个的比较字符,用count计数。后来发现算的太慢。加上其他的计算量得好几年。所以求教快速的算法!

论坛徽章:
0
2 [报告]
发表于 2010-06-01 16:00 |只看该作者
本帖最后由 t6760915 于 2010-06-01 16:03 编辑

你还发个代码的demo,其实慢在什么地方你也不知道呢,不如说你取这些自符串的地方,可能会慢,也可能是比较的地方。。。

论坛徽章:
0
3 [报告]
发表于 2010-06-01 16:23 |只看该作者
本帖最后由 hulnglei 于 2010-06-01 16:24 编辑

回复 2# t6760915


    确实如此,我也只是估计!

两个输入文件都是这样格式:都是大概80M大小

@080404_HWI-EAS121_0001FC209NNAAXX_4_1_931_319
AATTCTAACATGAAAGTAGGAAAGATGTCAC
@080404_HWI-EAS121_0001FC209NNAAXX_4_1_906_759
AATTCACAGCATTGCAGTAGGTTTTTTATCT
@080404_HWI-EAS121_0001FC209NNAAXX_4_1_895_807
AATTCAACAACAGGACATTAATTGGAAACGG
@080404_HWI-EAS121_0001FC209NNAAXX_4_1_905_794
AATTCAGAGCGCCACCCCATGGTGCCTCCTG

上面是字符串名字,下面行就是字符串,我就是整个比较字符串

我的脚本:


#!/usr/bin/python
# Filename: read the fastq file from p1 and p1 , conpare the each two sequences# to find snp. I think if there is a snp, the nulcleotide among it is the same

import sys

class Fastq:
        def __init__(self, name, seq):
                self.name = name
                self.seq = seq

def get_fastq(fh):
        """ read a fastq entry from a file handle """

        header = fh.readline()
# eof detection
        if not header:
                return None
# no fastq format
        if header[0] != '@':
                return None

        seq = ""
        line = fh.readline()
        seq = line[:-1]
        line = fh.readline()
        while line:
                if line[0] == '@':
                        fh.seek(-len(line), 1)
                        break
                line = fh.readline()

        return Fastq(header[1:-1], seq)


fip1 = open("seqp1.fasta")
fo = file("outsnp.txt",'w')
entryp1 = get_fastq(fip1)
while entryp1:
     #... do what you have to do
        fip2 = open("seqp2.fasta")
        entryp2 = get_fastq(fip2)
        while entryp2:
                snplist = []
                count = 0
                for i in range(5, len(entryp1.seq)):
                        if entryp1.seq!=entryp2.seq:
                                count = count + 1
                                i= i+ 1
                if count<2:
                        for j in range(5, len(entryp1.seq)):
                                if entryp1.seq[j]!=entryp2.seq[j]:
                                        snplist.append(j)
                                        snplist.append(entryp1.seq[j])
                                        snplist.append(entryp2.seq[j])
                                j=j+1

                        print >> fo, entryp1.name, entryp2.name, snplist
                entryp2 = get_fastq(fip2)
        fip2.close()
        print entryp1.name
        entryp1 = get_fastq(fip1)

fip1.close()
fo.close()

论坛徽章:
0
4 [报告]
发表于 2010-06-01 16:58 |只看该作者
回复  t6760915


    确实如此,我也只是估计!

两个输入文件都是这样格式:都是大概80M大小

@08 ...
hulnglei 发表于 2010-06-01 16:23



    读文件你可以采用for line in open('a.txt', 'r'):的方法一行一行读,写结果文件我觉得你的行数不太多的暂时保存在list里面,程序结束后将

result = '\n'.join(resultList)写入文件,你现在的情况可能每次比较后都要写文件,那自然是慢好多了

论坛徽章:
0
5 [报告]
发表于 2010-06-01 17:22 |只看该作者
本帖最后由 t6760915 于 2010-06-01 17:24 编辑
  1. #coding=utf-8

  2. import os
  3. import sys

  4. class cmp:
  5.     adict = {}
  6.     bdict = {}

  7.     def __init__(self):
  8.         self.adict = self.loadFile('a.txt')
  9.         self.bdict = self.loadFile('b.txt')

  10.     def loadFile(self, path):
  11.         if not path:
  12.             return False
  13.         
  14.         if not os.path.exists(path):
  15.             return False
  16.         
  17.         try:
  18.             fp = open(path, 'r')
  19.             
  20.             lines = []
  21.             for line in fp:
  22.                 lines.append(line.strip())

  23.             fp.close()
  24.         except:
  25.             return False
  26.         
  27.         if not lines:
  28.             return False
  29.         
  30.         names = []
  31.         values = []
  32.         for linnnum,line in enumerate(lines):
  33.             if not line:
  34.                 continue
  35.             
  36.             if linnnum % 2 == 0:
  37.                 names.append(line)
  38.             else:
  39.                 values.append(line)
  40.         
  41.         return dict(zip(names, values))

  42.     def run(self):
  43.         for key,val in self.adict.items():
  44.             if not self.bdict.has_key(key):
  45.                 print 'key %s not exists in b.txt' % key
  46.             else:
  47.                 if self.bdict[key] == val:
  48.                     print 'key %s eqal in a.txt and b.txt' % key
  49.                 else:
  50.                     print 'key %s not eqal in a.txt and b.txt' % key

  51.     def __del__(self):
  52.         self.adict = {}
  53.         self.bdict = {}

  54. if __name__ == '__main__':
  55.     c = cmp()
  56.     c.run()
复制代码
cmp.rar (999 Bytes, 下载次数: 46)
  1. D:\备份\cmp>python cmp.py
  2. key @080404_HWI-EAS121_0001FC209NNAAXX_4_1_905_794 eqal in a.txt and b.txt
  3. key @080404_HWI-EAS121_0001FC209NNAAXX_4_3_905_794 not exists in b.txt
  4. key @080404_HWI-EAS121_0001FC209NNAAXX_4_1_931_319 not eqal in a.txt and b.tx
  5. key @080404_HWI-EAS121_0001FC209NNAAXX_4_1_895_807 not eqal in a.txt and b.tx
  6. key @080404_HWI-EAS121_0001FC209NNAAXX_4_1_906_759 eqal in a.txt and b.txt

  7. D:\备份\cmp>
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-06-01 19:03 |只看该作者
本帖最后由 hulnglei 于 2010-06-01 21:41 编辑

回复 4# t6760915


太感谢t6760915 不过有没有加速比较的函数啊?
真的很感谢你的脚本,不过我的重点还是在比较。两个文件其实是从一个文件里面分离的,每一个序列的名字都是不同的。序列也是要比较,只能有1个字符的不同。多少都不行! 我试了下,就算不写入,还是很慢!唉!

我试用了下我的文件,飞快!不过要是要比较的函数就更好了
万分感谢

论坛徽章:
0
7 [报告]
发表于 2010-06-01 19:05 |只看该作者
本帖最后由 luffy.deng 于 2010-06-01 19:16 编辑
while entryp1:
     #... do what you have to do
        fip2 = open("seqp2.fasta")
        entryp2 = get_fastq(fip2)
         while
        .....
        fip2.close()
        ......
hulnglei 发表于 2010-06-01 16:23

光凭这一条 你就很欠扁。

论坛徽章:
0
8 [报告]
发表于 2010-06-01 19:16 |只看该作者
本帖最后由 hulnglei 于 2010-06-01 19:18 编辑

&ptid
光凭这一条 你就很欠扁。
luffy.deng 发表于 2010-06-01 19:05


? 不理解!我本来就是新手,如果被扁后能学到东西。我也是很愿意被扁的。 所以麻烦你解释清楚下好吗?

论坛徽章:
0
9 [报告]
发表于 2010-06-01 19:38 |只看该作者
seqp2.fasta从来没有改变过,你却把它打开关闭 100多万次,另外一行行的读  效率不会太高。80多兆完全可以考虑一次读取。其次字符串是否是定长?比较规则是什么 就是s1[1] == s2[1]    s1[2] == s2[2]  s1[3] == s2[3] ......这样?

论坛徽章:
0
10 [报告]
发表于 2010-06-01 19:50 |只看该作者
seqp2.fasta从来没有改变过,你却把它打开关闭 100多万次,另外一行行的读  效率不会太高。80多兆完全可以考 ...
luffy.deng 发表于 2010-06-01 19:38


太感谢了。

不同字符串比较就是生物里面的不同的DNA序列比较。我本来搞生物的,现在赶鸭子上架才学。所以只知道一行一行读,正在吃力的看5楼的代码

字符串是定长的31。我就是想请教下有什么好的比较规则或者函数没有。反正最终目标是两个字符串之间只有一个字符是不同的,其他都是一一对应。实在不行,其他判断字符串很相似的标准也行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP