2016-04-30 72 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

取空列表,然後迭代輸入字符串中的每個字符,並檢查字典中是否存在鍵(每個字符),如果找到匹配,則將值附加到您的初始列表中,如果找不到匹配,則將[當前字符]附加到您的初始列表。即使輸入字符串長度很高,也不會很繁瑣。 –