2017-10-12 44 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做出了澄清更改。 –