🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

957閲覧

pythonで抽出したものを多次元配列にする方法

yusuke1818

総合スコア10

Python

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

0グッド

0クリップ

投稿2020/12/22 05:46

編集2020/12/22 10:28
import glob list1=glob.glob("*.ent") print(list1) for name in list1: def consecutive_groups(iterable): """Yield range of consecutive numbers.""" for group in mit.consecutive_groups(iterable): group = list(group) if len(group) == 1: yield group[0] else: yield group[0], group[-1] path = name print("--------",name,"--------") serial_numbers_A = [] serial_numbers_B = [] with open(path) as f: lines = f.readlines() lines_strip = [line.strip() for line in lines] #A側のCAの抽出----------------------------- for A_and in lines: A_and=A_and.split() if A_and[0] == 'ATOM' and A_and[2] == 'CA' and A_and[4] == 'A': serial_numbers_A.append(int(A_and[5])) print("A側のCA") print(serial_numbers_A) #B側のCAの抽出----------------------------- for B_and in lines: B_and=B_and.split() if B_and[0] == 'ATOM' and B_and[2] == 'CA' and B_and[4] == 'B': serial_numbers_B.append(int(B_and[5])) print("B側のCA") print(serial_numbers_B) print("A側のCA") print(serial_numbers_A) print("B側のCA") print(serial_numbers_B) コード

上記のコード同じフォルダ内に存在する.entのファイルを順番にすべて抽出し
(ATOM,CA,A)を含む行の左から6要素目,(ATOM,CA,B)を含む行の左から6要素目をそれぞれ分けて抽出するプログラムである。
最後に
print(serial_numbers_A)
print(serial_numbers_B)
した時に、
entファイルの最後のファイルの

A側のCA
[19,20,21,22,23]
B側のCA
[19,20,21,22,23,24]

しか残りません。
自分としては、

A側のCA
[[4,5,6,7,8,9],[19,20,21,22,23]]
B側のCA
[[5,6,7,8,9],[19,20,21,22,23,24]]

と、前のリストを残したままの多次元配列にしたいのですがなりません。
なぜでしょうか、どうしたらよいのでしょか?
str型ではなくint型にしたいので['19','20']のような形ではなく、[19,20]のような形でお願いします。

pdb3asy.ent
ATOM 2 CA PRO A 4 29.341 -18.244 23.236 1.00112.52 C
ATOM 9 CA LYS A 5 28.103 -17.550 19.692 1.00 91.13 C
ATOM 18 CA PRO A 6 29.134 -14.592 19.578 1.00 63.64 C
ATOM 25 CA PHE A 7 26.489 -11.812 19.222 1.00 44.55 C
ATOM 36 CA VAL A 8 26.315 -10.401 15.682 1.00 31.29 C
ATOM 43 CA ILE A 9 24.530 -7.148 14.816 1.00 36.31 C
ATOM 1605 CA LYS B 5 8.357 5.403 38.590 1.00 58.36 C
ATOM 1614 CA PRO B 6 6.423 2.744 36.650 1.00 49.68 C
ATOM 1621 CA PHE B 7 7.816 1.954 33.187 1.00 42.38 C
ATOM 1632 CA VAL B 8 5.542 3.286 30.412 1.00 33.24 C
ATOM 1639 CA ILE B 9 5.633 1.843 26.875 1.00 38.75 C

pdb1uei.ent
ATOM 2 CA GLU A 19 3.064 55.105 10.319 1.00 49.16 C
ATOM 7 CA PRO A 20 5.276 54.565 13.375 1.00 45.41 C
ATOM 14 CA PHE A 21 8.486 52.580 12.821 1.00 41.16 C
ATOM 25 CA LEU A 22 8.142 49.315 14.760 1.00 39.99 C
ATOM 33 CA ILE A 23 11.230 47.602 16.165 1.00 35.70 C
ATOM 1598 CA GLU B 19 14.712 -0.274 9.422 1.00 42.06 C
ATOM 1603 CA PRO B 20 17.860 1.861 8.820 1.00 38.29 C
ATOM 1610 CA PHE B 21 19.955 3.309 11.660 1.00 32.78 C
ATOM 1621 CA LEU B 22 20.236 7.097 11.248 1.00 28.50 C
ATOM 1629 CA ILE B 23 23.276 8.881 12.612 1.00 22.92 C
ATOM 1637 CA GLY B 24 23.485 12.674 12.520 1.00 22.47 C

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

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

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

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

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

y_waiwai

2020/12/22 05:57

で、しつもんはなんでしょうか
yusuke1818

2020/12/22 05:59

あれ、すいません、しっかり投稿したんですが、半分しかできていません。 すぐ修正します。
y_waiwai

2020/12/22 06:04

ああ、teratailのバグで中途半端に投稿されるってのがあります 編集画面出して、投稿し直すといいです。
yusuke1818

2020/12/22 06:09

直しました!お願いします。
1T2R3M4

2020/12/22 06:35

serial_numbers_A = [] serial_numbers_B = [] でクリアしているとか。
yusuke1818

2020/12/22 06:57

どういうことですか?
1T2R3M4

2020/12/22 07:44

20行目あたりの    print("--------",name,"--------") の下で    serial_numbers_A = []    serial_numbers_B = [] としているのでforで回るたびに空のリストになるのかなと。
yusuke1818

2020/12/22 07:45

ではどうしたらよいのでしょか?
1T2R3M4

2020/12/22 23:35

そんな質問が来るとは思わなかった。 もしかして自分でコード書いていないのでしょうか。
yusuke1818

2020/12/23 00:46

書いてます。 forで回るたびに空のリストになるのは分かったうえで聞いているので 他に何を使ったりすればよいのかを聞いているだけなので
1T2R3M4

2020/12/23 02:27

>forで回るたびに空のリストになるのは分かったうえで聞いている のならば >entファイルの最後のファイルの > >A側のCA >[19,20,21,22,23] >B側のCA >[19,20,21,22,23,24] > >しか残りません。 は明らかで >前のリストを残したままの多次元配列にしたいのですがなりません。 >なぜでしょうか という疑問にはならないでしょう。
guest

回答1

0

ベストアンサー

dataframeを利用した時の例

python

1import pandas as pd 2import glob 3list1=glob.glob("*.ent") 4print(list1) 5 6serial_numbers_A = [] 7serial_numbers_B = [] 8for name in list1: 9 10 num_by_file_A = [] 11 num_by_file_B = [] 12 path = name 13 print("--------",name,"--------") 14 df = pd.read_fwf(name, None, [4,7, 4, 5, 2, 4, 12, 8, 8, 6, 6, 12], header=None) 15 print(df) 16 17 18#A側のCAの抽出----------------------------- 19 dfa = df[(df[0]=='ATOM') & (df[2]=='CA') & (df[4]=='A')] 20 21#B側のCAの抽出----------------------------- 22 dfb = df[(df[0]=='ATOM') & (df[2]=='CA') & (df[4]=='B')] 23 24 serial_numbers_A.append(dfa[5].values.tolist()) 25 serial_numbers_B.append(dfb[5].values.tolist()) 26 27print("A側のCA") 28print(serial_numbers_A) 29print("B側のCA") 30print(serial_numbers_B)

抽出のところは、A\Bを両方取得しておいて分けた方が良いかもしれないけど

python

1 df = df[(df[0]=='ATOM') & (df[2]=='CA')] 2 3 dfa = df[df[4]=='A'] 4 dfb = df[df[4]=='B'] 5

投稿2020/12/22 09:59

t_obara

総合スコア5488

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

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

yusuke1818

2020/12/22 10:26

すいませんstr型ではなくint型にしたいので ['19', '20', '21', '22', '23'] のような形ではなく [19,20,21,22,23] でお願いできませんか? その後の操作で誤作動になってしまうので、、 すいません。
yusuke1818

2020/12/23 00:51

すいません出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問