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

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

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

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

Q&A

解決済

1回答

278閲覧

python for文の繰り返しが終了したら変数を変えていきたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/01/14 13:18

編集2019/01/15 06:22

python3

1data = ["DDDDDDDDDD","DDDDDDDDDE","DDDDDEEEEE","DDDDDDDDDF","DDDDDEEEEF", 2 "DDDDDEEEFF","IIIILLLLVV","PPPPWWWWSS","DVYATKPCRH","LLLL" 3 ,"LLLL------"] 4 5 6#(1)アライメントの長さを計測し、各サイトの配列数も計上する。 7alignment_num = len(data) 8num = 7 9string_1 = data[num] 10sequense_num = len(string_1) 11print("アライメントの長さは"+str(alignment_num)+"で、サイト番号が" +str(num)+"の配列数は"+str(sequense_num)+"個である。") 12 13#(2)試験的にサイト7の保存度を算出してみる。 14amino_acid_type = "STYGAVLIFDNEQMCHKPWR" 15amino_acid_frequency = {} 16amino_acid_num = [] 17result_num = {} 18for test in amino_acid_type: 19 result = string_1.count(test) 20 if result > 0 : 21 frequency = (result/sequense_num) 22 amino_acid_frequency.setdefault(test,frequency) 23 amino_acid_num.append(test) 24 result_num.setdefault(test,result) 25 print("サイト中に"+test+"のアミノ酸が"+str(result)+"個存在していて、頻度は"+str(frequency)+"である") 26 gap = "-" 27 result_2 = string_1.count(gap) 28 if result_2 > 0: 29 print("サイト中のgapの数は"+str(result_2)+"個です。") 30 else: 31 continue 32print("この配列中には、" + str(len(amino_acid_num)) + "個の種類のアミノ酸がある。") 33print("この下の辞書には、分母のkに代入する各アミノ酸の個数が記録されている。") 34print(result_num) 35print("この下の辞書には、分母のnに代入する各アミノ酸に対応する頻度が計算されている。") 36print(amino_acid_frequency) 37keys_for_k = [e for e, w in result_num.items() ] 38keys_for_n = [k for k, v in amino_acid_frequency.items()] 39print(keys_for_k) 40 41denominator_half = [] 42for i in range (2): 43 paramate = 0 44 for string_2 in string_1[paramate:sequense_num-1]: 45 for string_3 in keys_for_k: 46 paramate += 1 47 if string_3 in string_2: 48 k_value = result_num[string_3] 49 #print(k_value) 50 n_value = amino_acid_frequency[string_3] 51 #print(n_value) 52 denominator_1 = (1/alignment_num) * (1/(k_value * n_value)) 53 #print(denominator_1) 54 denominator_half.append(denominator_1) 55 else: 56 continue 57 58print(len(denominator_half)) 59print(denominator_half)

#####質問
質問を再編集しました。今回やりたいことを具体的に記載します。
私はこのコードでマルチプルアライメントされたアミノ酸の保存度を計算しようと試みています。その際に、valder式を用いていて、この式の分母を計算する段階にいます。
ここで、コードの「denominate_half = []」、以下のfor文の中で「paramate = 0」の値を、for文が回るたびに更新していきたいと考え、上記のようなコードを書きました。しかし、paramateの値が更新されていなくて困っています。

このコードのどの部分が間違っているのかわかりません。
ご回答をいただいた方の文章中に、このコードが正常に動いていないのでは?と、ご指摘があったので、参考までに、以下に実行結果を記載します。

#####実行結果
アライメントの長さは11で、サイト番号が7の配列数は10個である。
サイト中にSのアミノ酸が2個存在していて、頻度は0.2である
サイト中にPのアミノ酸が4個存在していて、頻度は0.4である
サイト中にWのアミノ酸が4個存在していて、頻度は0.4である
この配列中には、3個の種類のアミノ酸がある。
この下の辞書には、分母のkに代入する各アミノ酸の個数が記録されている。
{'S': 2, 'P': 4, 'W': 4}
この下の辞書には、分母のnに代入する各アミノ酸に対応する頻度が計算されている。
{'S': 0.2, 'P': 0.4, 'W': 0.4}
['S', 'P', 'W']
18
[0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.2272727272727273, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.05681818181818182, 0.2272727272727273]

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/14 13:22

すみません、投稿してから見にくさに気づきました。以下に、編集版を貼ります。 for i in range (2): paramate = 0 print(paramate) for string_2 in string_1[paramate:sequense_num-1]: for string_3 in keys_for_k: if string_3 in string_2: paramate += 1 k_value = result_num[string_3] #print(k_value) n_value = amino_acid_frequency[string_3] print(n_value) denominator_1 = (1/alignment_num) * (1/(k_value * n_value)) #print(denominator_1) denominator_half.append(denominator_1) else: continue
退会済みユーザー

退会済みユーザー

2019/01/14 13:23

インデントが反映されないのですが、これでお願いできますでしょうか??
退会済みユーザー

退会済みユーザー

2019/01/14 13:25

もう一度、投稿し直して見ます。 言語名;python3 for i in range (2): paramate = 0 print(paramate) for string_2 in string_1[paramate:sequense_num-1]: for string_3 in keys_for_k: if string_3 in string_2: paramate += 1 k_value = result_num[string_3] #print(k_value) n_value = amino_acid_frequency[string_3] print(n_value) denominator_1 = (1/alignment_num) * (1/(k_value * n_value)) #print(denominator_1) denominator_half.append(denominator_1) else: continue
LouiS0616

2019/01/14 13:27 編集

修正欄ではどうあがいても仕様上無理です。 質問本文を、画像の指示に従って修正してください。
退会済みユーザー

退会済みユーザー

2019/01/14 13:36

指示に従って修正完了しました。少し戸惑って時間がかかってしまいすみませんでした。
LouiS0616

2019/01/14 13:49

修正感謝します。 --- > paramateの値を随時変更していきたいのですが、この記述方法では、paramateの値が更新されないのはどうしてなのでしょうか?? 変更されるはずですが。 paramate += 1 の次の行に print(paramate) と書けば更新を確認できます。
退会済みユーザー

退会済みユーザー

2019/01/14 13:54

ご回答ありがとうございます、更新できているのは確かに確認できました。 しかし、「for string_2 in string_1[paramate:sequense_num-1]:」で、このparamateの変数が更新されていない??のか意図した通りの値が算出されないんです。string_1の文字列から取ってくる文字数の量を変更していきたいのですが、この場合、私が行っている方法は誤っていると思われますか??
LouiS0616

2019/01/14 13:59 編集

string_1[paramate:sequense_num-1] はループに入る前に一回だけ処理されるので、ループ内の操作に影響されることはありません。 おそらく何か別の方法でご希望の動作は実現できるかと思いますが、 いかんせんコードの目的や各変数の役割が分からないのではっきりとは答えられないですね。
LouiS0616

2019/01/14 13:59 編集

ともすれば、 paramate = 0 の行を最初の行に持っていけばご希望の動作になるかもしれませんが。
退会済みユーザー

退会済みユーザー

2019/01/14 14:00

そうですよね、質問一辺倒ですみません。もう一度、何をしたいのかを明確にしてから質問内容をもう一度編集します。わかりづらくてすみませんm(_ _)m
guest

回答1

0

ベストアンサー

コード

paramateの値が更新される可能性があるのは赤矢印で示したところだけですが、そこに至るにはその前のif文の条件が真にならなければならないですし、そしてそもそもその前2つのfor文も適切に回ってなければなりません。「paramateの値が更新されないのはどうして」に対する答えは「赤矢印のコードが実行されていないから」になります。

追記

このページで動きを見てみるとparamateの値は少なくとも一度は0から1に更新されてますよ。

コード

投稿2019/01/15 01:50

編集2019/01/15 07:17
YouheiSakurai

総合スコア6142

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

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

退会済みユーザー

退会済みユーザー

2019/01/15 06:24

実行結果を編集して載せました。paramateの値更新以外は正常に動作していると思われる?のですが、どうでしょうか??
退会済みユーザー

退会済みユーザー

2019/01/15 07:22

確認しました。確かになっていますね、、、 paramate = 0 for string_2 in string_1[paramate:sequense_num-1]: このコードの中の、paramateの値を変化させたいんですけど、ここに反映されていないのでしょうか??
YouheiSakurai

2019/01/15 07:27

されないです。「for string_2 in string_1[paramate:sequense_num-1]:」は「for string_2 in string_1[0:sequense_num-1]:」と同じなのでparamateの値を後から変更しても意図されているような反映はなされません。
退会済みユーザー

退会済みユーザー

2019/01/15 07:42

そこが問題でした!!ご指摘ありがとうございます!! このコードでparamateが変更されるようにするためにはどうすればよいでしょうか?? 若干調べて見たところ、enumrateかrangeを用いて、直接paramateを変更するコードを組めば良いのでしょうか?? 組み方や考え方等がわからないので、コードの具体例と簡単な説明をお願いできますでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/15 08:15

参考文献ありがとうございます。なんとか理解できるように読み込んで見ます。 ただ、今回の質問で補足なのですが、if文で表記した内容は必ず真になることが保証されています。 elseは見た目が嫌だったのでつけて見たというだけでした、、、紛らわしくてすみません
退会済みユーザー

退会済みユーザー

2019/01/15 09:56

すみません、やっぱりわかりませんでした、、、 スライスの中の変数を更新するためにはどうしたら良いのでしょうか??
YouheiSakurai

2019/01/15 10:04

For文を回している「スライスの中の変数を更新する」事は出来ません。不要な部分を削ぎ落とした、動く、簡単なfor文を書いて、現状の動きと期待する動きを整理して、別質問を立ててみてください。その過程で自分で答えに気付くかもしれませんし、そうでなくともちゃんとした質問には回答がつきやすいので大丈夫でしょう。
退会済みユーザー

退会済みユーザー

2019/01/15 10:33

わかりました、そうしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問