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

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

ただいまの
回答率

90.75%

  • Python 3.x

    5312questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 197

crmy

score 7

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文を使用して計算を行いたいです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • manzyun

    2017/09/19 13:41 編集

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

    キャンセル

  • crmy

    2017/09/19 14:05

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

    キャンセル

回答 1

checkベストアンサー

+1

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

import math

class Coordinate():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def compute_distance(self, other):
        dx = self.x - other.x
        dy = self.y - other.y
        dz = self.z - other.z
        return math.sqrt(dx**2 + dy**2 + dz**2)

    def __str__(self):
        return 'x: {0}, y: {1}, z:{2}'.format(self.x, self.y, self.z)

def compute_distance(coord1, coord2):
    return coord1.compute_distance(coord2)

def main():
    with open('data.txt') as f:
        coord_dict = {}

        for line in f:
            elems = line.split()

            key = elems[0]
            values = list(map(float, elems[1:]))

            coord_dict[key] = Coordinate(*values)

            if key == 'E':
                print('-' * 50)
                print('A to B', compute_distance(coord_dict['A'], coord_dict['B']))
                print('A to D', compute_distance(coord_dict['A'], coord_dict['D']))
                print('A to E', compute_distance(coord_dict['A'], coord_dict['E']))

if __name__ == '__main__':
    main()

"""出力
--------------------------------------------------
A to B 5.744562646538029
A to D 7.734339015067804
A to E 4.464302857109943
--------------------------------------------------
A to B 5.138093031466052
A to D 6.833739825307955
A to E 6.8527366796047255
"""

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

import numpy as np

def main():
    with open('data.txt') as f:
        coord_dict = {}

        for line in f:
            elems = line.split()

            key = elems[0]
            values = np.array(elems[1:], dtype=np.float)

            coord_dict[key] = values

            if key == 'E':
                print('-' * 50)
                print('A to B', np.linalg.norm(coord_dict['A'] - coord_dict['B']))
                print('A to D', np.linalg.norm(coord_dict['A'] - coord_dict['D']))
                print('A to E', np.linalg.norm(coord_dict['A'] - coord_dict['E']))

if __name__ == '__main__':
    main()

"""出力
--------------------------------------------------
A to B 5.74456264654
A to D 7.73433901507
A to E 4.46430285711
--------------------------------------------------
A to B 5.13809303147
A to D 6.83373982531
A to E 6.8527366796
"""

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5312questions

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