2017-02-01 8 views
0

"ABA?"のような文字列を取得する関数があります。疑問符はAまたはBのいずれかのワイルドカードであり、渡された文字列は複数のワイルドカードを持つことができます。可能なすべてのソリューションを持つ配列として複数の文字列を返す必要があります。私のコードははるかに遅いです。私はPythonには新しいので、良い解決策を見つけるのは少し難しいです。いくつかの静的要素による高速順列

"ABA?" 'ABAA'、 'ABAB']を返す必要があります。

from itertools import product 

def possibilities(param): 
    result = [] 
    for i in product([A,B], repeat=param.count('?')): 
     string = param 
     for p in [i]: 
      for val in p: 
       string = string.replace('?', str(val), 1) 
      result.append(string) 
    return result 
+0

を私はあなたの質問を理解していません、繰り返しなしで手紙に1つずつ追加したいですか?だからABC出力:ABCA ABCB ABCCもしあなたが何を探しているのかは分かっています:https://docs.python.org/2/library/itertools.html – Teshtek

+0

Cはありません唯一の文字はABですAまたはBのワイルドカード – user2502106

答えて

1

generatorを使用すると、出力をループすることができます。あなたはワイルドカードをたくさん持っている場合は、完全なリストは、(それが指数関数的に増加!)完全に保存するために多くのメモリを必要とする

import itertools 

def possibilties(s): 
    n_wildcard = s.count('?') 

    for subs in itertools.product(['A','B'], repeat=n_wildcard): 
     subs = iter(subs) 
     yield ''.join([x if x != '?' else subs.next() for x in s]) 

for p in possibilties('A?BA?'): 
    print p 

これは与える:

AABAA 
AABAB 
ABBAA 
ABBAB 
+0

これは間違いなく良い解決策ですが、それは10%速くする必要があるはずですが、完了までには時間がかかりますが、これがどのように達成されたかは本当に分かりません。 – user2502106

関連する問題