2017-10-12 38 views
-1

鑑於兩個詞所有可能的字符串:生成兩個字符串保持在python位置

AT 
TC 

我想(如果組合適用於這裏不知道)生成所有可能的組合可以通過更換一個生產這兩個字符串的一個字符,其結果是:

AT 
TT 
AC 
TC 

編輯:

我已經試過:

from itertools import product 
ref = "ACGT" 
snp = "TGCA" 
prod = product(ref,snp) 
for p in prod: 
    print p 

但結果是:

('A', 'T') 
('A', 'G') 
('A', 'C') 
('A', 'A') 
('C', 'T') 
('C', 'G') 
('C', 'C') 
('C', 'A') 
('G', 'T') 
('G', 'G') 
('G', 'C') 
('G', 'A') 
('T', 'T') 
('T', 'G') 
('T', 'C') 
('T', 'A') 

不是我要找的。我期待像(每個結果應該是相同的lenght輸入):

ACGT 
TCGT 
AGGT 
ACGA 
.... 
+0

你到目前爲止嘗試過什麼? –

+2

聽起來像是一個作業['itertools.product()'](https://docs.python.org/3/library/itertools.html#itertools.product)。 – Evert

+0

itertools的產品,但那不是我正在尋找的。其實我想要的是我需要做的事情的名字,所以我可以檢查數學背景。 – user1532587

回答

2

您正在尋找itertools.product您可以使用這樣的:

>>> from itertools import product 
>>> my_list = [ 'AT' , 'TC'] 

>>> list(product(*my_list)) 
[('A', 'T'), ('A', 'C'), ('T', 'T'), ('T', 'C')] 

要獲得這些值作爲字符串,您可以使用列表理解爲:

>>> [''.join(s) for s in product(*my_list)] 
['AT', 'AC', 'TT', 'TC'] 

編輯(基於編輯中的問題)

對於所共享的新的例子,你應該使用zip與上述列表理解表達和itertools.product爲:

>>> ref = "ACGT" 
>>> snp = "TGCA" 

>>> [''.join(s) for s in product(*zip(ref,snp))] 
['ACGT', 'ACGA', 'ACCT', 'ACCA', 'AGGT', 'AGGA', 'AGCT', 'AGCA', 'TCGT', 'TCGA', 'TCCT', 'TCCA', 'TGGT', 'TGGA', 'TGCT', 'TGCA'] 
+1

笑你打我:P –

+0

其實,我已經有一個字符串lenght 4審判,這不是我所期望的,只是編輯的問題 – user1532587

1

這應該產生所需輸出,其中,所述字符從兩個字符串固定在它們的位置:

from itertools import product 

ref = "ACGT" 
snp = "TGCA" 
for p in product(*zip(ref, snp)): 
    ''.join(p) 

'ACGT' 
'ACGA' 
'ACCT' 
'ACCA' 
'AGGT' 
'AGGA' 
'AGCT' 
'AGCA' 
'TCGT' 
'TCGA' 
'TCCT' 
'TCCA' 
'TGGT' 
'TGGA' 
'TGCT' 
'TGCA' 

zip兩個序列和迭代壓縮對的笛卡爾積。

+0

它的一個很好的建議:) +1 ...林不知道這是equivelent ..但是假設每個字符對的位置都被鎖定,那麼它應該是...它已經有一段時間了,因爲我把我的生物信息學課程 –

1

以下應解決您的使用情況

list(''.join(s) for s in list(itertools.product(*zip(a, b)))) 
+0

你能解釋一下這個工作是如何的嗎?我如何計算結果的最終數量? – user1532587

1

考慮存在每個長度爲4的兩個字符串的情況。想象一下這個長度相同的位掩碼(四個)。每個可能的位掩碼都應該對應於其中一個字符串的有效選擇。

所以給出:

ABCD 
zyxw 

那麼這裏的結果:

0000 -> ABCD 
0001 -> ABCw 
0010 -> ABxD 
0011 -> ABxw 
0100 -> AyCD 
0101 -> AyCw 
0110 -> AyxD 
0111 -> Ayxw 

    .... and so on 

要概括認爲,正弦產生的所有數字在基數n達到這些字符串長度的順序。(不知道如何處理非均勻字符串長度;但是原理相同,即使添加某種「NULL」填充可以從結果中過濾出來,類似於我們如何常規過濾來自我們的前導零正常的十進制數表示)。

我沒有時間,現在編寫代碼這一權利。但方法是將每個字符串映射到一個符號(數字或字符),並根據您的數字字符串及其長度適當地迭代整數範圍。例如八個字符兩個字符串各爲2 8(256),而七個字符三串每個會3 7(2187)等是。

轉換的每個整數其在您的基本表示和查找該映射中提取用於從存儲在該鍵的值(字符串)該位置的字符。這與您將整數轉換爲任何基數所用的相同,取模n並移至零。

+0

我的回答是基於對問題的錯誤解釋,因爲它似乎是OP做出了澄清更改。 –