【问题标题】:Python switching multiple positions in string each to multiple lettersPython将字符串中的多个位置分别切换为多个字母
【发布时间】:2020-10-19 21:01:02
【问题描述】:

我正在尝试编写一个 python 代码来查找 DNA 序列中的限制性酶切位点。限制性内切酶切割特定的 DNA 序列,但有些没有那么严格,例如 XmnI 切割该序列:

GAANNNNTTC

其中 N 可以是任何核苷酸(A、C、G 或 T)。如果我的数学是正确的,那么它可以切割 4^4 = 256 个独特的序列。我想列出这 256 个短序列,然后根据(更长的)输入 DNA 序列检查每个短序列。但是,我很难生成 256 个序列。这是我目前所拥有的:

cutsequencequery = "GAANNNNTTC"
Nseq = ["A", "C", "G", "T"]
querylist = []
if "N" in cutsequencequery:
    Nlist = [cutsequencequery.replace("N", t) for t in Nseq]
    for j in list(Nlist):
        querylist.append(j)

for i in querylist:
    print(i)
print(len(querylist))

这是输出:

GAAAAAATTC
GAACCCCTTC
GAAGGGGTTC
GAATTTTTTC
4

所以它将每个 N 切换为 A、C、G 和 T,但我认为我需要另一个循环(或 3 个?)来生成所有 256 个组合。有没有我看不到的有效方法?

【问题讨论】:

  • 所以每次出现“N”时,你都想替换Nseq中的每个值
  • 完全正确。将每个 N 切换为 A、T、G 或 C,并生成序列的每个组合。
  • 要替换那些N,您需要为每个N 循环一个for,然后将它们替换为nseq 的下一组可能结果。无论如何,我在下面发布了(我认为是)使用itertool's product 的解决方案。

标签: python string loops random sequence


【解决方案1】:

也许你应该看看python's itertools library,其中包括product,它使用每个迭代器组合创建一个迭代器,因此:

from itertools import product

cutsequencequery = "GAANNNNTTC"
nseq = ["A", "C", "G", "T"]

size = cutsequencequery.count('N')

possibilities = product(*[nseq for i in range(size)]) 
# = ('A', 'A', 'A', 'A'), ... , ('T', 'T', 'T', 'T') 
# len(list(possibilities)) = 256 = 4^4, as expected

s = set()
for n in possibilities:
    print(''.join(n)) # = 'AAAA', ..., 'TTTT'
    new_sequence = cutsequencequery.replace('N' * size, ''.join(n))
    
    s.add(new_sequence)
    print(new_sequence) # = 'GAAAAAATTC', ..., 'GAATTTTTTC'
print(len(s)) # 256 unique sequences

【讨论】:

  • 这行得通,不知道 itertools 库。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多