参照シーケンスとテスト シーケンスの間で可能なすべての置換を行おうとしています。シーケンスは常に同じ長さであり、目標はテスト文字を参照の文字に置き換えることです。
Ref= "AAAAAAAAA"
Test="AAATAATTA"
望ましい出力:
AAATAATTA, AAATAAAAA, AAATAATAA, AAATAATTA, AAAAAATTA, AAAAAATAA, AAAAAAATA
参照シーケンスとテスト シーケンスの間で可能なすべての置換を行おうとしています。シーケンスは常に同じ長さであり、目標はテスト文字を参照の文字に置き換えることです。
Ref= "AAAAAAAAA"
Test="AAATAATTA"
望ましい出力:
AAATAATTA, AAATAAAAA, AAATAATAA, AAATAATTA, AAAAAATTA, AAAAAATAA, AAAAAAATA
itertools.product
2 つの文字列を一緒に使用する場合は、これを使用できます(組み合わせを見つけるzip
ために、それらを 2 タプルのセットに変換します)。product
次に、おそらくセット内でそれらを一意にしたいと思うでしょう。全体として、次のようになります。
>>> {''.join(t) for t in product(*zip(Ref, Test))}
{'AAAAAAAAA', 'AAAAAATAA', 'AAAAAAATA', 'AAATAATTA', 'AAATAATAA', 'AAATAAAAA', 'AAATAAATA', 'AAAAAATTA'}
問題の機能に慣れていない場合、回線ノイズのように見えるので、もう少し詳しく説明します...
zip
これは、2 つの文字列をペアの反復に変換するものです (簡単に印刷できるようにリスト内包表記でラップしますが、次の段階でそれを削除します) 。
>>> [t for t in zip(Ref, Test)]
[('A', 'A'), ('A', 'A'), ('A', 'A'), ('A', 'T'), ('A', 'A'), ('A', 'A'), ('A', 'T'), ('A', 'T'), ('A', 'A')]
このproduct
関数は、任意の数の iterable を引数として取ります。を使用して、2タプルのすべてを個別の引数としてフィードしたい*
:
>>> [t for t in product(*zip(Ref, Test))]
[('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'), ('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'), ... (a whole lot of tuples)
これらのタプルを文字列に戻すために使用join
します。
>> [''.join(t) for t in product(*zip(Ref, Test))]
['AAAAAAAAA', 'AAAAAAAAA', 'AAAAAAATA', 'AAAAAAATA', ... (still a whole lot of strings)
そして、これを{}
リスト内包表記 ( ) ではなく集合内包表記 ( ) に[]
することで、固有の要素だけを取得します。