2016-04-30 36 views
2

我试图把一个代码放在一起,用一种组合方式将给定输入字符串中的唯一字符替换为字典中的对应值,同时保留“非”唯一字符的位置。使用多字母排列

例如,我有以下的解释:

d = {'R':['A','G'], 'Y':['C','T']} 

怎么会去更换“R”和“Y”的所有实例同时产生该字符串的所有可能的组合,但维持“A的位置'和'C'?

例如,输入 'ARCY' 将产生以下输出:

'AACC' 
'AGCC' 
'AACT' 
'AGCT' 

希望这是很有意义的。如果任何人都能指引我走向正确的方向,那会很棒!

+2

使用'str.replace'替换字符和['itertools.permutations'](https://docs.python.org/3.5/library/itertools.html#itertools.permutations)作为排列。 – ChrisP

+0

独特的,你的意思是我们在输入中只看到R和Y一次吗? – ayhan

+0

独特的意思是,像R和Y这样的字符被多个值替换,而其他所有字符保持不变。 – moj

回答

1

以下generator function产生所有你想要的字符串,使用enumeratezipitertools.product,一个list comprehensionargument list unpacking的所有这些都非常方便Python您应该阅读的工具/概念:

from itertools import product 

def multi_replace(s, d): 
    indexes, replacements = zip(*[(i, d[c]) for i, c in enumerate(s) if c in d]) 
    # indexes: (1, 3) 
    # replacements: (['A', 'G'], ['C', 'T']) 

    l = list(s) # turn s into sth. mutable 
    # iterate over cartesian product of all replacement tuples ... 
    for p in product(*replacements): 
     for index, replacement in zip(indexes, p): 
      l[index] = replacement 
     yield ''.join(l) 

d = {'R': ['A', 'G'], 'Y': ['C', 'T']} 
s = 'ARCY' 

for perm in multi_replace(s, d): 
    print perm 

AACC 
AACT 
AGCC 
AGCT 

s = 'RRY' 

AAC 
AAT 
AGC 
AGT 
GAC 
GAT 
GGC 
GGT 
+0

太棒了!这很好,谢谢。 – moj

0

变化ARCY多个列表,并使用下面的代码:

import itertools as it 
list = [['A'], ['A','G'],['C'],['C','T']] 
[''.join(item) for item in it.product(*list)] 

import itertools as it 
list = ['A', 'AG','C', 'CT'] 
[''.join(item) for item in it.product(*list)] 
+0

有没有办法从字典中检索值而不是列出来?如果我将输入扩展为15个字符,则此方法将变得非常繁琐。 – moj

+0

取空列表,然后迭代输入字符串中的每个字符,并检查字典中是否存在键(每个字符),如果找到匹配,则将值附加到您的初始列表中,如果找不到匹配,则将[当前字符]附加到您的初始列表。即使输入字符串长度很高,也不会很繁琐。 –