簡體   English   中英

不用itertools展望未來

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM