没有itertools就向前看

时间:2013-07-08 19:17:00

标签: python python-3.x itertools

我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母只有A,G,C,U或N.我创建了一个字典。我可以看到的所有可能性。我已经尝试了itertools,但无济于事,我听说itertools会将所有内容保存在内存中,因为我的文件相当大(有时大于10GB),这将是最无效的。我真的很感激帮助,我已经在这里闲逛了几天寻找答案。我正在思考或尝试正则表达式,但我不知道如何。我真的想找到最有效的大文件方式。这是我(可怜的)尝试。

我已经在Python for-loop look-ahead

上找到了答案
f2 = open(path to file)
from itertools import tee
from itertools import permutations

def pairwise(iter):
   "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iter)
    next(b, None)
    return zip(a, b)

p = permutations(['A','G','U','C','N'])
for per in p:
    per = ''.join(per)
    dic={'a':[]}
    dic['a'].append(per)

for line, next_line in pairwise(f2):


    if line in dic['a']:

        letter= next_line.split()
        unilist.append('%s' %next_line)
        print (unilist)

看来问题出在:for line,next_line in pairwise(f2) 我会非常感激每一个提示和建议。

编辑:我指的是行中的字符而不是next_line中的字符。

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题:

  • 您放弃每个排列循环迭代dic并从头开始重新创建它。建立一次:

    dic={'a':[''.join(per) for per in permutations('AGUCN')]}
    

    但是对于快速成员资格测试(if something in sequence),请改用set

    dic={'a': set(''.join(per) for per in permutations('AGUCN'))}
    

    请注意,目前尚不清楚为什么需要一个带有一个键的字典;一个简单的变量就可以了。

  • 您读取了一个文件,但是没有从行中删除换行符。使用换行符,您的if line in dic['a']测试将永远不会返回True,因为生成

    的代码

只需将文件视为可迭代文件,在其上调用next()即可获得下一行:

from itertools import permutations

patterns = set(''.join(per) for per in permutations('AGUCN'))
unilist = []

for line in f2:
    if line.strip() in patterns:
        unilist.append(next(f2).strip())

甚至:

from itertools import permutations

patterns = set(''.join(per) for per in permutations('AGUCN'))
unilist = [next(f2).strip() for line in f2 if line.strip() in patterns]

你并没有真正展望未来。你在看后面;如果前一行与条件匹配,则追加下一行。

答案 1 :(得分:1)

“itertools is evil”是一个完全基于unbased的语句 - 相反,itertools提供了一组不同的工具来处理iterables,

在这种情况下,您必须使用itertools.tee - 否,它不会将您的所有物品保留在内存中