2014-10-05 23 views
0
生成序列

所以,我已經取得了一系列的一組元素,像這樣:如何從不同的系列

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「等?

回答

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') 
+0

我甚看着itertools。但是,我當然錯過了這一點。現在我覺得啞巴,哈哈。 – 2014-10-05 20:29:14

+0

+1剛剛擊敗了我 – 2014-10-05 20:29:38