Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 没有itertools,展望未来_Python_Python 3.x_Itertools - Fatal编程技术网

Python 没有itertools,展望未来

Python 没有itertools,展望未来,python,python-3.x,itertools,Python,Python 3.x,Itertools,我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母a、G、C、U或N时。我创建了一个我可以查看的所有可能性的目录。我尝试过itertools,但没有用,我听说itertools会将所有内容都保存在内存中,这是最没有效率的,因为我的文件相当大(有时大于10GB)。我真的很感激你的帮助,我已经在这里徘徊了好几天,寻找答案。我在考虑或尝试regex,但我不知道怎么做。我真的很想为大文件找到最有效的方法。这是我(可怜的)尝试 我参与了以下内容的部分回答: 问题似乎在于:对于行,成对的下一行(

我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母a、G、C、U或N时。我创建了一个我可以查看的所有可能性的目录。我尝试过itertools,但没有用,我听说itertools会将所有内容都保存在内存中,这是最没有效率的,因为我的文件相当大(有时大于10GB)。我真的很感激你的帮助,我已经在这里徘徊了好几天,寻找答案。我在考虑或尝试regex,但我不知道怎么做。我真的很想为大文件找到最有效的方法。这是我(可怜的)尝试

我参与了以下内容的部分回答:

问题似乎在于:对于行,成对的下一行(f2) 我将非常感谢每一个提示和建议

编辑:我指的是行中的字符,而不是下一行中的字符。

“itertools是邪恶的”是一个完全没有根据的说法-相反,itertools提供了一套不同的工具来处理iterables


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

您的代码有几个问题:

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

    dic={'a':[''.join(per) for per in permutations('AGUCN')]}
    
    但是,对于快速成员资格测试(
    如果有顺序的内容
    ),请使用
    集合

    dic={'a': set(''.join(per) for per in permutations('AGUCN'))}
    
    请注意,您不清楚为什么需要一个带一个键的词典;一个简单的变量在这里就可以了

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

只需将文件视为一个iterable,对其调用
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]

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

不要向前看,而要向后看。在内存中保留两行。
pairwise()
方法是@Martijn的标准方法。再次感谢,您总是很有帮助的。希望有一天我能像你一样回报你……什么是
f2
?它没有在您的代码片段中定义。为什么要为每个排列重建
dic
?最后只保留最后一个排列。您可能需要定义一次
dic={'a':[]}
。感谢您的澄清。
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]