从python中保持位置的两个字符串生成所有可能的字符串

2024-09-23 20:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

给出两个词:

AT
TC

我想生成所有可能的组合(这里不确定组合是否适用),这些组合可以通过将这两个字符串中的一个字符替换来生成,结果是:

^{pr2}$

编辑:

我试过了:

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')

不是我要找的。我希望得到类似(每个结果的长度应与输入相同):

ACGT
TCGT
AGGT
ACGA
....

Tags: 字符串fromimportref编辑prodproduct字符
3条回答

下面应该解决您的用例

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

考虑这样的情况:有两个字符串,每个字符串的长度为4。想象一下四个面具的长度。每个可能的位掩码都应该对应于一个字符串中的有效选择。在

鉴于:

ABCD
zyxw

结果如下:

^{pr2}$

为了推广,考虑n-字符串生成以n为底的所有数字,直到这些字符串长度的顺序。(不确定如何处理非统一的字符串长度;但原理是相同的,即使您添加了某种从结果中筛选出来的“NULL”填充;类似于我们从常规十进制数表示中过滤前导零的方式)。在

我现在没有时间为此编写代码。但方法是将每个字符串映射到一个符号(数字或字符),并根据数字字符串及其长度在整数范围内进行迭代。例如,两个8个字符的字符串是28(256),而三个7个字符的字符串则是37(2187),依此类推。在

将每个整数转换为其在基中的表示形式,并查找映射,从存储在该键的值(字符串)中提取该位置的字符。这和你把整数转换成任意基数的方法是一样的,取模n并移动到零。在

您正在查找itertools.product,您可以使用如下内容:

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

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

要以字符串形式获取这些值,可以使用列表理解作为:

^{pr2}$

编辑(基于问题中的编辑)

对于您共享的新示例,您应该将zip与上面的list comprehension表达式和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']

相关问题 更多 >