-1

当第一个字符是字母只有 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 中的字符。

4

2 回答 2

2

您的代码有几个问题:

  • 您丢弃dic每个置换循环迭代并从头开始重新创建它。构建一次:

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

    但对于快速成员资格测试 ( if something in sequence),请改用 a 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]

你并没有真正向前看。你在后面看;如果上一行符合条件,则追加下一行。

于 2013-07-08T19:41:50.503 回答
1

“itertools is evil”是一个完全没有根据的陈述——相反,itertools 提供了一组不同的工具来处理可迭代对象,

在这种情况下,您必须使用itertools.tee- 不,它不会将所有项目保存在内存中

于 2013-07-08T19:19:20.840 回答