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

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

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

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

Q&A

解決済

1回答

271閲覧

if文を使用した特定行の読み込み

crmy

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2017/09/19 04:18

編集2017/09/19 05:05

A 1.2 3.6 2.1
B 2.2 -0.4 6.1
C 2.9 -4.2 0
D 3.4 4.9 9.4
E 4.8 1.2 3.2
A 1.1 3.8 9.1
B -2.1 3.4 5.1
C 1.2 0.9 5.4
D 2.5 0.3 3.4
E 2.3 2.4 2.5


このようにABCのxyz座標が続いている文字があったとして、AB、AD、AE間の距離を計算したい場合
if文を使って、Cの座標のみ読み込まないようなプログラムを書きたいのですが、どのように書けば
よいでしょうか?
このようなプログラムを書きましたがうまくいきませんでした。

name = [""]*line_number xxx_coord = [0.0]*line_number yyy_coord = [0.0]*line_number zzz_coord = [0.0]*line_number for k in range(atom_number): line = input_file.readline() items = line.split() atom_name[k] = items[0] xxx_coord[k] = float( items[1] ) yyy_coord[k] = float( items[2] ) zzz_coord[k] = float( items[3] ) k =+ 1 for i in range(line_number): if name == "C": continue for j in range(line_number): if atom_name == "C": continue dx = xxx_coord[i] - xxx_coord[j] dy = yyy_coord[i] - yyy_coord[j] dz = zzz_coord[i] - zzz_coord[j] square_r = dx*dx + dy*dy + dz*dz r = math.sqrt( square_r )

あくまで、if文を使用して計算を行いたいです。
よろしくお願いします。

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

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

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

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

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

manzyun

2017/09/19 04:43 編集

恐れ入ります。この質問文のプログラムのコードのはじめと終わりに 「```(半角ダッシュ3つ)」を追記いただき、インデントをつけて、もともとのソースコードがどのようになっているのか分かりやすく変更お願いいたします。
crmy

2017/09/19 05:05

変更しました、よろしくお願いいたします。
guest

回答1

0

ベストアンサー

もとの質問はインデントが崩れてしまっているので、解読できません。
こんな感じのアウトプットを期待されているのでしょうか?

Python

1import math 2 3class Coordinate(): 4 def __init__(self, x, y, z): 5 self.x = x 6 self.y = y 7 self.z = z 8 9 def compute_distance(self, other): 10 dx = self.x - other.x 11 dy = self.y - other.y 12 dz = self.z - other.z 13 return math.sqrt(dx**2 + dy**2 + dz**2) 14 15 def __str__(self): 16 return 'x: {0}, y: {1}, z:{2}'.format(self.x, self.y, self.z) 17 18def compute_distance(coord1, coord2): 19 return coord1.compute_distance(coord2) 20 21def main(): 22 with open('data.txt') as f: 23 coord_dict = {} 24 25 for line in f: 26 elems = line.split() 27 28 key = elems[0] 29 values = list(map(float, elems[1:])) 30 31 coord_dict[key] = Coordinate(*values) 32 33 if key == 'E': 34 print('-' * 50) 35 print('A to B', compute_distance(coord_dict['A'], coord_dict['B'])) 36 print('A to D', compute_distance(coord_dict['A'], coord_dict['D'])) 37 print('A to E', compute_distance(coord_dict['A'], coord_dict['E'])) 38 39if __name__ == '__main__': 40 main() 41 42"""出力 43-------------------------------------------------- 44A to B 5.744562646538029 45A to D 7.734339015067804 46A to E 4.464302857109943 47-------------------------------------------------- 48A to B 5.138093031466052 49A to D 6.833739825307955 50A to E 6.8527366796047255 51"""

NumPyを使ったらもっと楽になりそうですが。

Python

1import numpy as np 2 3def main(): 4 with open('data.txt') as f: 5 coord_dict = {} 6 7 for line in f: 8 elems = line.split() 9 10 key = elems[0] 11 values = np.array(elems[1:], dtype=np.float) 12 13 coord_dict[key] = values 14 15 if key == 'E': 16 print('-' * 50) 17 print('A to B', np.linalg.norm(coord_dict['A'] - coord_dict['B'])) 18 print('A to D', np.linalg.norm(coord_dict['A'] - coord_dict['D'])) 19 print('A to E', np.linalg.norm(coord_dict['A'] - coord_dict['E'])) 20 21if __name__ == '__main__': 22 main() 23 24"""出力 25-------------------------------------------------- 26A to B 5.74456264654 27A to D 7.73433901507 28A to E 4.46430285711 29-------------------------------------------------- 30A to B 5.13809303147 31A to D 6.83373982531 32A to E 6.8527366796 33"""

もっといい方法がありそうな気もしますが、とりあえずこんな感じで。
pandasとかpandasとかpandasとか。

投稿2017/09/19 04:46

編集2017/09/19 04:55
LouiS0616

総合スコア35660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問