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

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

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

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

Q&A

解決済

3回答

605閲覧

1列ずつ取り出すにはどうすればいいのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2021/12/21 13:28

前提・実現したいこと

ni = collections.Counter(result)
をprint(ni)で出力すると、
Counter({'A': 4})
Counter({'A': 4, 'C': 3, 'D': 1})
Counter({'A': 4, 'C': 3, 'D': 3, 'E': 2})
Counter({'A': 5, 'C': 4, 'D': 4, 'E': 3})
となってしまうのですが
Counter({'A': 4}) (1列目がAが4つあるのでこうなります)
Counter({'C': 3, 'D': 1}) (2列目はCが3つ、Dが1つあるのでこうなります)
Counter({'D': 2, 'E': 2}) (3列目はDが2つ、Eが2つあるのでこうなります)
Counter({'A': 1, 'C': 1, 'D': 1, 'E': 1}) (4列目はAが1つ、Cが1つ、Dが1つ、Eが1つあるのでこうなります)
のように出力したいです。

ちなみに、fasの中身は

P0

ACDE

Q2

ACDD

P4

ACEC

Q

ADEA
です。

該当のソースコード

python

1import math 2import collections 3 4f = open('fas','r') 5 6seq = "" 7result = "" 8q = [] 9shannon = [] 10 11for line in f: 12 if '>' in line: 13 if seq == "": 14 continue 15 p = list(seq.replace("\n","")) 16 q.append(p) 17 seq = "" 18 else: 19 seq += line 20 21q.append(list(seq.replace("\n",""))) 22 23num = len(q) 24 25e = 0 26i = 0 27 28for e in range(len(q[0:4])): 29 for i in range(len(q)): 30 result += q[i][e] 31 i += 1 32 e += 1 33 34 ni = collections.Counter(result) 35 print(ni) 36 37 for j in ["A","C","D","E","F","G","H","I","K","L","M","N","P","Q","R","S","T","V","W","Y","-"]: 38 pi = ni[j]/num 39 if pi > 0: 40 shannon.append(float(pi*math.log(pi,2))) 41 print(-sum(shannon))

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

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

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

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

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

guest

回答3

0

こういう感じです。

python

1from collections import Counter 2 3with open('fas', 'r') as f: 4 q = [line for line in f.read().split('\n') if len(line)>0 and line[0] != '>'] 5 6ni = [Counter(c) for c in zip(*q)] 7 8print(ni)

実行結果

python

1>>> print(q) 2['ACDE', 'ACDD', 'ACEC', 'ADEA'] 3>>> 4>>> ni = [Counter(c) for c in zip(*q)] 5>>> 6>>> print(ni) 7[Counter({'A': 4}), Counter({'C': 3, 'D': 1}), Counter({'D': 2, 'E': 2}), Counter({'E': 1, 'D': 1, 'C': 1, 'A': 1})]

投稿2021/12/21 16:55

ppaul

総合スコア24666

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

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

退会済みユーザー

退会済みユーザー

2021/12/21 22:53

いつも回答していただきありがとうございます。 ppaul様の言う通りにやったら得たかった結果を得ることができました。 しかし、リストで取り出すと後のコードでエラーが出てしまうのですがリスト以外でエラーの出ない方法などありましたら、教えていただきたいです。 エラーの表示は以下の通りです。 [Counter({'A': 4}), Counter({'C': 3, 'D': 1}), Counter({'D': 2, 'E': 2}), Counter({'E': 1, 'D': 1, 'C': 1, 'A': 1})] Traceback (most recent call last): File "", line 32, in <module> pi = ni[j]/num TypeError: list indices must be integers or slices, not str
guest

0

ベストアンサー

python

1from collections import Counter 2import math 3 4q = [] 5with open('fas', 'r') as f: 6 for line in f: 7 if line[0] == '>': continue 8 q.append([*line.strip()]) 9 10ni = list(map(Counter, map(list, zip(*q)))) 11 12num = len(ni) 13pattern = 'ACDEFGHIKLMNPQRSTVWY-' 14for i in range(num): 15 shannon = [] 16 for j in pattern: 17 pi = ni[i][j]/num 18 if pi > 0: 19 shannon.append(float(pi*math.log(pi, 2))) 20 print(f'{i}: {-sum(shannon)}') 21 22# 230: -0.0 241: 0.8112781244591328 252: 1.0 263: 2.0

投稿2021/12/21 14:17

編集2021/12/22 00:29
melian

総合スコア19803

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

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

退会済みユーザー

退会済みユーザー

2021/12/21 22:55

ご回答ありがとうございます。melian様のおっしゃる通りにコードを書いたら得たかった結果を出力できたのですが、リストで作成すると以下のようなエラーが出てしまいます。エラーの出ない方法も教えていただけたら恐縮です。 [Counter({'A': 4}), Counter({'C': 3, 'D': 1}), Counter({'D': 2, 'E': 2}), Counter({'E': 1, 'D': 1, 'C': 1, 'A': 1})] Traceback (most recent call last): File "", line 32, in <module> pi = ni[j]/num TypeError: list indices must be integers or slices, not str
melian

2021/12/22 00:30

後半部分を追加してみました。
guest

0

resultに各列の情報を入れていますが、行が進んでもresultの中身をそのままにしているからそうなります。

行のカウントが終ったところで、resultを空にすればいいでしょう。

投稿2021/12/21 14:02

TakaiY

総合スコア12765

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

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

退会済みユーザー

退会済みユーザー

2021/12/21 22:48

resultを空にするというのはresult += 1とするということでしょうか?
TakaiY

2021/12/22 00:41

空にするのですから、 result="" ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問