[英]Look ahead without itertools
當第一個字符是字母A,G,C,U或N時,我正在尋找一種查看文本文件下一行的方法。我創建了一個dict。 我可以看到的所有可能性。 我已經嘗試過itertools,但無濟於事,而且我聽說itertools會將所有內容都保留在內存中,因為我的文件很大(有時大於10GB),因此最無用。 我非常感謝您的幫助,我已經在這里徘徊了好幾天尋找答案。 我正在考慮或嘗試使用正則表達式,但是我不知道該怎么做。 我真的想為大文件找到最有效的方法。 這是我的(可憐的)嘗試。
我已經找到了以下答案的一部分: Python for-loop提前
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)
看來問題出在:對於pairwise(f2)中的line,next_line,我將非常感謝每一個技巧和建議。
編輯:我的意思是該行中的字符,而不是next_line中的字符。
您的代碼有幾個問題:
您在每次置換循環迭代時都放棄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']
測試中的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]
您並不是真正的未來。 您正在向后看; 如果上一行符合條件,則追加下一行。
“ itertools是邪惡的”是完全沒有根據的陳述-相反,itertools提供了一組不同的工具來處理可迭代對象,
在這種情況下,您必須使用itertools.tee
不,它不會將所有項目都保留在內存中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.