Python 没有itertools,展望未来
我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母a、G、C、U或N时。我创建了一个我可以查看的所有可能性的目录。我尝试过itertools,但没有用,我听说itertools会将所有内容都保存在内存中,这是最没有效率的,因为我的文件相当大(有时大于10GB)。我真的很感激你的帮助,我已经在这里徘徊了好几天,寻找答案。我在考虑或尝试regex,但我不知道怎么做。我真的很想为大文件找到最有效的方法。这是我(可怜的)尝试 我参与了以下内容的部分回答: 问题似乎在于:对于行,成对的下一行(f2) 我将非常感谢每一个提示和建议 编辑:我指的是行中的字符,而不是下一行中的字符。“itertools是邪恶的”是一个完全没有根据的说法-相反,itertools提供了一套不同的工具来处理iterablesPython 没有itertools,展望未来,python,python-3.x,itertools,Python,Python 3.x,Itertools,我正在寻找一种方法来查看文本文件中的下一行,当第一个字符是字母a、G、C、U或N时。我创建了一个我可以查看的所有可能性的目录。我尝试过itertools,但没有用,我听说itertools会将所有内容都保存在内存中,这是最没有效率的,因为我的文件相当大(有时大于10GB)。我真的很感激你的帮助,我已经在这里徘徊了好几天,寻找答案。我在考虑或尝试regex,但我不知道怎么做。我真的很想为大文件找到最有效的方法。这是我(可怜的)尝试 我参与了以下内容的部分回答: 问题似乎在于:对于行,成对的下一行(
在这种情况下,您必须使用
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,因为生成
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]