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

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

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

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

Q&A

解決済

1回答

1421閲覧

pythonでif分で出力した結果をリストに格納する

22Go

総合スコア55

Python

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

0グッド

1クリップ

投稿2018/12/02 06:08

編集2018/12/02 06:18

python

1with open("short.sequ.txt") as f: 2 for line in f: 3 if line.startswith(">"): 4 print(line) 5 seq = "" 6 else: 7 seq += "".join(line.split()) 8 count = [len(seq)] 9 print(count)
short.sequ.txt >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

結果が

python

1>YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655] 2 3[70] 4[140] 5[210] 6[280] 7[350] 8[420] 9[490] 10[505] 11[505] 12[505] 13>YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655] 14 15[70] 16[85] 17[85]

これが結果なのですが、
[]でくくられた数値を内包表記で[ , , , , , ]と表記し、最大値を抽出するか、
最大値(ここでゆう505と85)だけを表示したいです。

どうしてもリストに格納することができなくて悩んでます。

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

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

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

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

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

yamato_user

2018/12/02 06:16

short.sequ.txtの内容を追記してください
y_waiwai

2018/12/02 06:16

コードをコピペで実行できるようにしてくれませんか
guest

回答1

0

ベストアンサー

前以て空のリストを用意しておいて、他の処理はループ後に行えば良いです。

Python

count = [len(seq)]
print(count)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Python

1リスト.append(len(seq))

内包表記で[ , , , , , ]と表記

おそらく内包表記の意味を勘違いして覚えています。

書いてみた

要件を考えれば、もっとシンプルに書けそうです。

Python

1data = [] 2with open('short.sequ.txt') as fin: 3 for line in map(str.rstrip, fin): 4 if not line: 5 continue 6 7 if line.startswith('>'): 8 data.append([line, 0]) 9 else: 10 data[-1][-1] += len(line) 11 12for datum in data: 13 print(*datum, sep='\n')

実行結果 Wandbox

>YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655] 505 >YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655] 85

少しリファクタして、さらに高級にしてみた。

Python

1from collections import Counter 2 3 4data = [] 5with open('short.sequ.txt') as fin: 6 for line in map(str.rstrip, fin): 7 if not line: 8 continue 9 10 if line.startswith('>'): 11 data.append([line, Counter()]) 12 else: 13 data[-1][-1].update(line) 14 15for tag, counter in data: 16 print(tag) 17 18 print( 19 sum(1 for _ in counter.elements()) 20 ) 21 for k, count in counter.most_common(): 22 print(k, count) 23 24 print() 25

実行結果 Wandbox

>YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655] 505 L 50 S 46 V 37 R 36 E 35 G 33 A 31 T 29 I 27 D 25 P 24 Q 23 F 23 K 19 N 19 Y 14 C 12 W 10 H 8 M 4 >YP_009518833.1 uncharacterized protein YtiA [Escherichia coli str. K-12 substr. MG1655] 85 G 9 L 7 I 7 V 6 R 6 T 5 Q 5 P 5 C 5 E 4 F 4 S 4 A 4 D 3 W 3 M 2 K 2 H 2 Y 2

コメントを受けて

date[-1][-1] += len(line)の[-1][-1]の意味

data は、リストを要素に持つリストです。
まずdataの末尾のリストを取り出し、その結果の末尾の要素を取り出しています。

Python

1>>> tmp = [[11, 12], [21, 22], [31, 32]] 2>>> print(tmp[-1]) 3[31, 32] 4>>> print(tmp[-1][-1]) 532

最後の for datum in date: print(*datum) がわからない

この例に限っては、次のように書くのと同じです。

Python

1for datum in data: 2 for e in datum: 3 print(e)

なぜこのように書き換えられるか知りたいならこちらをどうぞ。
Qiita - Python3.xのアスタリスク逆引き

投稿2018/12/02 06:27

編集2018/12/09 11:59
LouiS0616

総合スコア35660

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

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

22Go

2018/12/02 06:33

回答ありがとうございます with open("short.sequ.txt") as f: for line in f: if line.startswith(">"): print(line) seq = "" else: count = [] seq += "".join(line.split()) count.append(len(seq)) print(count) こうゆうことでしょうか? 結果がまた同じでした。
LouiS0616

2018/12/02 06:46

『前以て空のリストを用意しておいて』 『他の処理はループ後に行えば良いです。』 意味が分かりますか。
LouiS0616

2018/12/02 06:50

空のリストを準備するのはループより前です。 printするのはループより後です。 コードを実行するときには実行結果を予想する癖を付けましょう。
22Go

2018/12/02 07:07

申し訳ありません。助言ありがとうございます。 前もってリストを作成し、ループ後にprintしましたが理想の結果が出ませんでした。
22Go

2018/12/02 07:17

>YP_009518834.1 putative uncharacterized protein YjiT [Escherichia coli str. K-12 substr. MG1655] [505] にしたと思ってます。この場合どのような構成にしたらいいでしょうか?
LouiS0616

2018/12/02 08:02

最大値を抽出したいということでしょうか?
22Go

2018/12/02 14:26

はい、short.sequ.txtでゆう、[505]と[85]を(最大値)出力したいです。
LouiS0616

2018/12/03 04:06

それならば、最初にデータを一気に読み込んだ方が楽なように思います。 メモリを圧迫するのが難点ではありますが。
LouiS0616

2018/12/03 04:14

...と思いましたが、要件を考えるともっと簡潔に書けました。 この方法ならメモリも圧迫しません。 回答に追記しましたので、ご参照ください。
22Go

2018/12/04 13:10

非常に助かりました。ありがとうございます。 全く無知識のまま質問ばかりをしてしまい申し訳ありませんでした。
22Go

2018/12/04 14:03

付け加えて再度質問させていただきたのですが data = [] with open('short.sequ.txt') as fin: for line in map(str.rstrip, fin): if not line: continue if line.startswith('>'): data.append([line, 0]) else: data[-1][-1] += len(line) for datum in data: print(*datum, sep='\n') このコードでmaxを使用していないのに、最大値が表示されているのには どのようなチャートでこの結果がでるのか教えていただきたいです。
LouiS0616

2018/12/04 14:06

各行の文字数をカウントして足しているだけだからです。
22Go

2018/12/09 08:39

時間が空いてしまいましたが、質問お願いいたします。 data = [] with open('short.sequ.txt') as fin: for line in map(str.rstrip, fin): if not line: continue if line.startswith('>'): data.append([line, 0]) else: data[-1][-1] += len(line) for datum in data: print(*datum, sep='\n' このコードに関してですが、 else: date[-1][-1] += len(line) の[-1][-1]の意味と 最後の for datum in date: print(*datum) がわからないので、よかったら教えていだだきたいです。 よろしくお願い申し上げます。
LouiS0616

2018/12/09 11:59

追記しました。
22Go

2018/12/09 15:19

ありがとうございます。 大変分かりやすく、感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問