使用multidict的排列

时间:2016-04-30 21:25:31

标签: python dictionary cartesian-product

我试图整理一个代码,用一个组合方式替换给定输入字符串中的唯一字符和字典中的相应值,同时保留“非”字符的位置。独特的人物。

例如,我有以下字典:

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

如何更换所有' R'和' Y'虽然产生了所有可能的字符串组合,但保持了' A'的位置。和' C'?

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

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

希望这是有道理的。如果有人能指出我正确的方向,那就太好了!

2 个答案:

答案 0 :(得分:1)

以下generator function使用enumeratezipitertools.productlist 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

答案 1 :(得分: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)]