2017-01-02 1 views
1

itertools.productリストのすべての順列を生成するのに非常に便利ですが、そのリストの要素は一度にどんな順列にも入ることができますか?擬似コードでリストのすべての順列を生成する方法もありますが、任意の順列で1回だけ出現できる文字列を追加する方法

from itertools import product 
product('ABC', repeat=1) + ['.', '%3A'] 
->A, B, C, .A, .B, .C, A., B., C., %3AA, %3AB, %3AC, A%3A, B%3A, C%3A 

私はそれが非些細なことだろうと仮定し、1は、順列の構築アルゴリズムを微調整する必要があります。

+0

時には([X/Yを参照してください、あなたの問題について質問する方が簡単である代わりに、あなたが考案したソリューションを実装する方法を求めて、これら3つを別々に生成します問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

答えて

1

あなたは3シリーズです。元の入力文字列をリストにしてから、前に追加して追加します。リスト内包と

from itertools import chain, product 

inputstring = 'ABC' 
extra = ['.', '%3A'] 
for combo in chain(inputstring, 
     product(extra, inputstring), product(inputstring, extra)): 
    combo = ''.join(combo) 
    print(combo) 

デモ:

>>> from itertools import chain, product 
>>> inputstring = 'ABC' 
>>> extra = ['.', '%3A'] 
>>> [''.join(combo) for combo in chain(inputstring, product(extra, inputstring), product(inputstring, extra))] 
['A', 'B', 'C', '.A', '.B', '.C', '%3AA', '%3AB', '%3AC', 'A.', 'A%3A', 'B.', 'B%3A', 'C.', 'C%3A'] 
+0

私の擬似コードで 'repeat'引数を増やすと、余分な文字列が必要になりますig 'AA、A%3AA、..' – ChiseledAbs

+0

@ChiseledAbs:ゴールポストを動かさないでください。値を*の中に入れることは、 'product'のもう一つの反復です。 'combo +(combo [0]、)')を二重にするジェネレータ(式または関数)に 'product(inputstring、extra)'をラップします。 –

+0

@ChiseledAbs:Pauloがあなたのコメントで指摘しているようにあなたが解決している問題についてはより明確にする必要があります。解決策であると考えるものを実装する方法だけでなく、その問題に対する明確な解決策を提供するのに役立ちます。あなたはコモンズでまだ考えていないより多くのバリエーション。 –

関連する問題