1

参照シーケンスとテスト シーケンスの間で可能なすべての置換を行おうとしています。シーケンスは常に同じ長さであり、目標はテスト文字を参照の文字に置き換えることです。

Ref= "AAAAAAAAA"
Test="AAATAATTA"

望ましい出力:

AAATAATTA, AAATAAAAA,  AAATAATAA,  AAATAATTA,  AAAAAATTA,  AAAAAATAA,  AAAAAAATA
4

3 に答える 3

3

itertools.product2 つの文字列を一緒に使用する場合は、これを使用できます(組み合わせを見つける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)

そして、これを{}リスト内包表記 ( ) ではなく集合内包表記 ( ) に[]することで、固有の要素だけを取得します。

于 2020-04-28T15:13:35.920 に答える