質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

279閲覧

itertools.permutationsについて!

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/06 10:12

###やりたいこと
「A」を4文字分と、「-」を17文字分使用して、合計で21文字となる文字列を作成したい。

♦︎条件
作成する文字列は、21文字分の中から、Aが入る部分、つまり4文字分を選ぶので、5,985(21C4)通りの文字列を生成することになる。

###検索して試した内容
######1,Pythonドキュメントから
https://docs.python.org/ja/3/library/itertools.html
Pythonのドキュメントから、itertoolsをimportし、以下のようにpermutationsを使用することで、作成できると考えた。

Pythonドキュメントから引用↓

itertools.permutations(iterable, r=None)
rが指定されない場合や None の場合、r はデフォルトで iterable の長さとなり、可能な最長の順列の全てが生成されます。

python3

1import itertools 2 3amino_acid = ['A','-'] 4for create_column in itertools.permutations(amino_acid, r = 21): 5 print(create_column)

引用文より、rの引数を指定してやればいいと考え、r = 21と変更してみた。
しかし、実行してみても何も実行されない。

試しに、amino_acidに入っている文字の数に指定すると、

Python3

1import itertools 2 3amino_acid = ['A','-'] 4for create_column in itertools.permutations(amino_acid, r = 2): 5 print(create_column)

以下の結果を返す。

terminal

1('A', '-') 2('-', 'A')

#疑問点
→rを設定しても意味がなかった?ようだ。しかし、ドキュメントではrの指定によって、任意の数の文字列を作成することが可能であると解釈できる文言が記述されている。これは僕の解釈ミスでしょうか?
御指南いただけると嬉しいです!よろしくお願いします!

###実は問題そのものは調べているうちに解決しました

python3

1import itertools 2 3amino_acid = ['A','-'] 4 5# a = 0 6column_list = [] 7for create_column in itertools.product(amino_acid, repeat = 21): 8 column = "" 9 # print(create_column) 10 for column_prot in create_column: 11 column += column_prot 12 count_column = column.count('A') 13 if count_column == 4: 14 column_list.append(column) 15 column = "" 16print(column_list) 17print(len(column_list))

terminal

1↓多すぎるので全て載せるのは省略 2,'-------------AA---AA-', '-------------AA---A-A', '-------------AA----AA', '-------------A-AAA---', '-------------A-AA-A--', '-------------A-AA--A-', '-------------A-AA---A', '-------------A-A-AA--', '-------------A-A-A-A-', '-------------A-A-A--A', '-------------A-A--AA-', '-------------A-A--A-A', '-------------A-A---AA', '-------------A--AAA--', '-------------A--AA-A-', '-------------A--AA--A', '-------------A--A-AA-', '-------------A--A-A-A', '-------------A--A--AA', '-------------A---AAA-', '-------------A---AA-A', '-------------A---A-AA', '-------------A----AAA', '--------------AAAA---', '--------------AAA-A--', '--------------AAA--A-', '--------------AAA---A', '--------------AA-AA--', '--------------AA-A-A-', '--------------AA-A--A', '--------------AA--AA-', '--------------AA--A-A', '--------------AA---AA', '--------------A-AAA--', '--------------A-AA-A-', '--------------A-AA--A', '--------------A-A-AA-', '--------------A-A-A-A', '--------------A-A--AA', '--------------A--AAA-', '--------------A--AA-A', '--------------A--A-AA', '--------------A---AAA', '---------------AAAA--', '---------------AAA-A-', '---------------AAA--A', '---------------AA-AA-', '---------------AA-A-A', '---------------AA--AA', '---------------A-AAA-', '---------------A-AA-A', '---------------A-A-AA', '---------------A--AAA', '----------------AAAA-', '----------------AAA-A', '----------------AA-AA', '----------------A-AAA', '-----------------AAAA'] 35985

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

原因については、既にtiitoiさんが回答されているとおりです。


itertoolsだけでは書きづらい場合では、more-itertoolsが強力です。

Python

1>>> import more_itertools 2>>> 3>>> amino_acid = 'A'*4 + '-'*17 4>>> amino_acid 5'AAAA-----------------' 6>>> 7>>> gen = more_itertools.distinct_permutations(amino_acid) 8>>> sum(1 for _ in gen) # lenの代わり 95985

投稿2019/08/06 10:33

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/06 12:58 編集

いつもありがとうございます! ご提示いただいた方法だと、最初から使う文字を指定できるのがかなり魅力ですね! 僕のコードですと、一度、全てのパターンを計算しなければいけないのでどう考えても遅くなります。。。
guest

0

ベストアンサー

→rを設定しても意味がなかった?ようだ。しかし、ドキュメントではrの指定によって、任意の数の文字列を作成することが可能であると解釈できる文言が記述されている。これは僕の解釈ミスでしょうか?

itertools.permutations(iterable, r) は、n 個の要素を持つ iterable から r 個を選ぶすべてのパターンを返す関数です。パターン数は nCr です。
(厳密にはパターンを生成するジェネレーターを返す関数)

もし、permutations(["A", "-"], r=4) のように n < r の場合、2個しかないリストから4個の要素を選ぶことはできないので、1つもパターンは生成されません。

投稿2019/08/06 10:19

編集2019/08/06 10:21
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/06 10:24

そのまんまですね。お恥ずかしい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問