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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

353閲覧

シーケンスファイルから文字列を判別して結合し、カウントしたい

22Go

総合スコア55

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/29 11:44

編集2018/11/30 10:55

python

YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655]

MGQSEYISWVKCTSWLSNFVNLRGLRQPDGRPLYEYHATNDEYTQLTQLLRAVGQSQSNICNRDFAACFV
LFCSEWYRRDYERQCGWTWDPIYKKIGISFTATELGTIVPKGMEDYWLRPIRFYESERRNFLGTLFSEGG
LPFRLLKESDSRFLAVFSRILGQYEQAKQSGFSALSLARAVIEKSALPTVFSEDTSVELISHMADNLNSL
VLTHNLINHKEPVQQLEKVHPTWRSEFPIPLDDETGTHFLNGLLCAASVEAKPRLQKNKSTRCQFYWSEK
HPDELRVIVSLPDEVSFPVTSEPSTTRFELAICEDGEEVSGLGPAYASLENRQATVRLRKSEVRFGRQNP
SAGLSLVARAGGMIVGSIKLDDSEIAIGEVPLTFIVDADQWLLQGQASCSVRSSDVLIVLPRDNSNVAGF
DGQSRAVNVLGLKALPVKGCQDVTVTANETYRIRTGREQISIGRFALNGKRASWVCHPDETFIGVPKVIS
TLPDIQSIDVTRYTC

YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655]

MKEFLFLFHSTVGVIQTRKALQAAGMTFRVSDIPRDLRGGCGLCIWLTCPPGEEIQWVIPGLTESIYCQQ
DGVWRCIAHYGVSPR

「>」でタンパク質名を判定し、print後、「>」で始まらない文字列に関して 空白を削除し、1行にまとめ、空白を認識後にカウントしたい ```python with open("short.sequ.txt") as f: for line in f: if line.startswith(">"): print(line) else: seq = "".join(line.split()) print(seq) count = len(seq) print(count)

YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655]

MGQSEYISWVKCTSWLSNFVNLRGLRQPDGRPLYEYHATNDEYTQLTQLLRAVGQSQSNICNRDFAACFV
70
LFCSEWYRRDYERQCGWTWDPIYKKIGISFTATELGTIVPKGMEDYWLRPIRFYESERRNFLGTLFSEGG
70
LPFRLLKESDSRFLAVFSRILGQYEQAKQSGFSALSLARAVIEKSALPTVFSEDTSVELISHMADNLNSL
70
VLTHNLINHKEPVQQLEKVHPTWRSEFPIPLDDETGTHFLNGLLCAASVEAKPRLQKNKSTRCQFYWSEK
70
HPDELRVIVSLPDEVSFPVTSEPSTTRFELAICEDGEEVSGLGPAYASLENRQATVRLRKSEVRFGRQNP
70
SAGLSLVARAGGMIVGSIKLDDSEIAIGEVPLTFIVDADQWLLQGQASCSVRSSDVLIVLPRDNSNVAGF
70
DGQSRAVNVLGLKALPVKGCQDVTVTANETYRIRTGREQISIGRFALNGKRASWVCHPDETFIGVPKVIS
70
TLPDIQSIDVTRYTC
15

0

0

YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655]

MKEFLFLFHSTVGVIQTRKALQAAGMTFRVSDIPRDLRGGCGLCIWLTCPPGEEIQWVIPGLTESIYCQQ
70
DGVWRCIAHYGVSPR
15

0

else文でjoin.splitがうまく作用していないのですが、
どのように書き換えたらいいのでしょうか?
70.70.70.....と続くのではなく加算した値を出したいのです
もう1つ疑問点として0が出現しているのですがこの理由も教えていただきたいです。
宜しくお願い致します。

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

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

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

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

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

KSwordOfHaste

2018/11/29 14:10

本サイトでは質問文中のコード部分はMarkdownによる記述が必要です。そうしないと字下げが表現できず特にPythonでは情報伝達に致命的な祖語が起きます。画面したのヘルプのリンクをたどり「マークダウンの使い方」を調べて質問を編集してください。
KSwordOfHaste

2018/11/30 12:15

コードのmarkdownはつけていただいたのですが、本当のコードは字下げがあるはずです。Pythonでは字下げがコードの意味を左右するので質問には実際のコードを記述ください。
22Go

2018/11/30 12:34

スペースを入れたいのですが、プレビューに反映されないのはどうしたらよいでしょうか?
KSwordOfHaste

2018/11/30 19:33

ご質問にはcode用markdownを2つ記述しておられますが、最初の方のmarkdown行が「```python```」になってます。これを「```text」に直してみてください。
guest

回答1

0

ベストアンサー

python

1with open("short.sequ.txt") as f: 2 for line in f: 3 if line.startswith(">"): 4 print(line) 5 else: 6 seq = "".join(line.split()) 7 print(seq) 8 count = len(seq) 9 print(count)

このコードでのfor文は入力ファイルの「各行」に対しのループになります。
入力ファイルに(わかりやすいように行番号を入れ空白を*に変えると)このようになってます。

text

11:>YP_009518834.1*putative*uncharacterized*protein*YjiT*[Escherichia*coli*str.*K-12 substr.*MG1655]*** 22:MGQSEYISWVKCTSWLSNFVNLRGLRQPDGRPLYEYHATNDEYTQLTQLLRAVGQSQSNICNRDFAACFV** 33:LFCSEWYRRDYERQCGWTWDPIYKKIGISFTATELGTIVPKGMEDYWLRPIRFYESERRNFLGTLFSEGG** 4 ----+----1----+----2----+----3----+----4----+----5----+----6----+----7 <=column

それゆえelseは2行目,3行目で各々実行されます。つまり

else文でjoin.splitがうまく作用していないのです

行末の2つの半角スペースが削除されて行の長さ70が表示されていますので「記述したとおりに動いている」ということになります。プログラムってのは常に「記述したとおりに動く」ので当然の結果なのですが・・・。「うまく作用していない」すなわち「期待した通りの動作でない」原因はseqが「入力の各行に対する空白を除去した結果でしかなく行の連結をしていないからです。

行の連結をするには

python

1with open("short.sequ.txt") as f: 2 for line in f: 3 if line.startswith(">"): 4 print(line) 5 seq = "" # 見出し行を検出したらseqの内容をリセットする 6 else: 7 seq += "".join(line.split()) # 見出し行以外はseqへ「連結」する 8 print(seq) 9 count = len(seq) 10 print(count)

しかしこのままでは2行目、3行目(およびそれ以降の行)でいちいち連結途中の行と文字数が印字されてしまいます。見づらくてもよいから結果さえ得られればよいということあれば上記のままでもよいでしょう。しかし「まとめた行の内容と文字数を一度だけ表示したい」ということであればもう少し論理をひねる必要があります。プログラミング論理を組むことに慣れてないとちょっと難しく感じるかも知れませんが、必要であれば「一度だけ表示する論理」についてもトライしてみるとよいと思います。

投稿2018/11/30 20:05

KSwordOfHaste

総合スコア18394

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

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

22Go

2018/12/02 02:47

「一度だけ表示」に関してトライしてみたのですが count = o count += Len(seq) max_count = (count) print(maxcount) これだと結果が変わらないのですがどうしたらいいでしょうか? 最高値を出力するか、内包表記で出力値をリストに格納してsumで合計値を出したいと考えています。
22Go

2018/12/02 02:58

len_list = [] seq += "".join(line.split()) count = 0 count += len(seq) len_list.append(count) print(len_list) このようにしたらリストに入るかと思ったのですが、1つ1つが[]に 格納されてしました。
KSwordOfHaste

2018/12/02 08:10 編集

考え方を変えたほうがよいでしょう。countを加算する必要はありません。seqに連結しているのですから必要なタイミングでlen(seq)を調べてそれをそのまま印字すればよいだけです。自分の回答で「ちょっと難しい」といったのは「どういうタイミングで印字すればよいか」を工夫するのがちょっと難しいかも知れないと感じたのです。
KSwordOfHaste

2018/12/02 08:12

もし、seqそのものの連結後の内容は不要で、長さだけが必要なら自分の回答の論理はちょっと変わりますが、いずれにせよ多分難しいのは同じ点です。(どういうタイミングで印字すべきか)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問