如何从不同的集合生成序列

时间:2014-10-05 20:23:15

标签: python list generator

所以我有一系列元素,如:

elements= {
 'a' : '12345',
 'b' : '67890',
 'c' : 'abcdefg',
 'd' : 'hijklmn',
 ...
}

我想要做的是有一个函数,它接受输出的定义,并返回上述匹配该定义的集合中所有可能的字符组合。

例如,如果函数收到'abbc',那么它将返回包含set a中一个字符的所有字符串的集合,后跟set b中的字符,后跟set b中的字符,然后来自集合c的字符。

理想情况下,这会返回一个生成器。

我正在努力的是如何构建遍历输入字符的循环,从elements中选择正确的集合,然后生成所有先前输入的所有组合。

例如,如果我只是循环输入,就像这样,我该如何获得下一个序列?

for c in list(input):
    element_set = list(elements[c])
    #now I've got the list of elements for this character, but how do I combine all possible values here with all possible values for the next character?

我可以建立一个列表列表,最后我得到以下内容:

[ list(elements[a]), list(elements[b]), list(elements[b]), list(elements[c]) ]

但是我如何抓住“位置0的所有可能值”+“位置1的所有可能值”等?

1 个答案:

答案 0 :(得分:3)

您可以使用对此有用的itertools

>>> elements = {'a': '12', 'b': '67', 
                'c': 'ab', 'd': 'hi'} # shortened example; 875 answers otherwise!
>>> s = 'abbc'
>>> from itertools import product
>>> for t in product(*[elements[c] for c in s]):
    print t


('1', '6', '6', 'a')
('1', '6', '6', 'b')
('1', '6', '7', 'a')
('1', '6', '7', 'b')
('1', '7', '6', 'a')
('1', '7', '6', 'b')
('1', '7', '7', 'a')
('1', '7', '7', 'b')
('2', '6', '6', 'a')
('2', '6', '6', 'b')
('2', '6', '7', 'a')
('2', '6', '7', 'b')
('2', '7', '6', 'a')
('2', '7', '6', 'b')
('2', '7', '7', 'a')
('2', '7', '7', 'b')