2016-04-28 86 views
1

我寫了下面的代碼,使20個字符的所有字符串長與A,T,G和C的組合Itertools停止字符連續重複

然而,我想避免超過3的一行中有相同的字符,所以我添加了一個if函數來檢查這個。麻煩的是,這是在itertools代碼之後,所以它有點慢。我想知道是否有辦法使用itertools來產生這個結果,而不必運行itertools,然後運行if函數?

import sys 
import itertools 
import re 

x = ["A","T","G","C"] 
for i in itertools.product(x, repeat=20): 
     i = "".join(i) 
     if re.search(r"(\w)\1\1",i): 
       continue 
     else: 
       sys.stdout.write(i) 
+1

'permutations'沒有'repeat'關鍵字參數。你確定這是你的代碼嗎?你是什​​麼意思*避免連續超過3個相同的字符*? – styvane

+2

我很確定它的目標是成爲'產品',它'*'採用'repeat'參數,而不像'permutations'那樣* jonc *希望它做。 –

+0

您是否試過numpy選擇採取您的列表的隨機樣本: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html#numpy.random.choice This你可以指定你想要的數量。 – SSchneid

回答

2

在票面價值,這個問題似乎問這樣的:

如何過濾這個巨大的字符串列表,而不必首先構建整個列表的痛苦?

答案是:你已經在做它! itertools中的東西產生迭代構建的延遲生成的序列。所以你現有的代碼是而不是產生了數十億字符串的巨大列表。

但是,還有你可能會想要問一個可能更有趣的問題:

如果我通過生成的所有字符串,並與三胞胎過濾掉那些無三重串,我的代碼是有做額外的工作,因爲大部分生成的字符串都會有三元組。假設字符串按字典順序生成;那麼他們的第一個4 ** 17就會開始AAA,我們真的應該可以跳過所有這些。我們怎樣才能做得更好?

不幸的是,如果你想要做那麼你將不得不編寫自己的代碼來做到這一點; itertools不提供這種「模式篩選產品」功能。

它可能是這個樣子:

# generate all n-tuples with the property that their k-th element 
# is one of the things returned by successors(initial (k-1)-tuple). 
# So e.g. the first element is one of the things returned by 
# successors(()). 
def restricted_tuples(successors, n): 
    assert(n>=0) 
    if n==0: 
     for t in successors(()): yield (t,) 
    else: 
     for start in restricted_tuples(successors, n-1): 
      for t in successors(start): yield start+(t,) 

def successors_no_triples(start, alphabet): 
    if len(start)<2 or start[-1] != start[-2]: 
     for t in alphabet: yield t 
    else: 
     banned = start[-1] 
     for t in alphabet: 
      if t != banned: yield t 

print([''.join(x) for x in restricted_tuples(lambda start: successors_no_triples(start,'ABC'), 5)]) 

print末僅僅是說明性的。如果您想從原始提問者的案例中打印出所有數十億字符串,則最好循環遍歷restricted_tuples生成的序列,並分別對每一個字符串進行串化和打印。

順便提一下,4個帶有這個屬性的字母的長度爲20的序列數量結果是415,289,569,968。如果您嘗試全部生成它們,您將會等待一段時間,尤其是如果您真的想要做到任何事情。

+0

哎呦,你是對的。我會編輯它以使用更好的名稱。 –

+0

...完成。對於那個很抱歉。 –

+0

謝謝。我稍微修改這個所以它打印上的蒼蠅,現在我應該得到一些有用的字符串(希望其中一個或多個不匹配的基因組,我會尋找他們反對(其中包括字符A,T,G長串, C)。 – meld24