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

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

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

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

Python 3.x

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

Q&A

解決済

1回答

1059閲覧

pythonシェル(ipython)による実行とスクリプトによる実行の違いについて

onomu-

総合スコア7

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

Python 3.x

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

0グッド

0クリップ

投稿2018/05/31 11:40

編集2018/06/01 02:14

前提・実現したいこと

初めて投稿させていただく初心者のものです。至らぬ点も多いかとは思いますがよろしくお願いします。
実現したい事を端的に申し上げますと
データベースにアクセス
→データベースから特定の情報群Aを取得→情報群Aの中から特定の情報A'をリスト形式で取得
→他の情報群B,C,…に対してもB',C'を獲得し辞書形式{A:A',B:B',C:C',…}で保存する
という流れです。

発生している問題・エラーメッセージ

pythonのBioPDBと呼ばれるライブラリを利用して特定の情報Y'を取得しようとしたのですが、
スクリプトを起動させたところlist.appendを行う際に値の取得に失敗し、TypeErrorを起こしてしまいました。
ここで、以下の事を試しました。
①他の情報群Xで試す→成功
②失敗した情報群Yをpythonシェル(ipython)で分割して実行→成功

以上の事を踏まえると自分のスクリプトが特定のデータに対応していない事が考えられるのですが、どの部分が原因なのかが全く分かりません。そこで、②の結果がヒントになるように思えるのですが…
どなたか、スクリプトでまとめて実行する場合とpythonシェル(ipython)で数行ずつ実行(for文の塊レベル)する場合の動作の違いを教えて頂けますでしょうか?
list.append()が成功しないからには、ミュータブルなオブジェクトである事が関係している気はしています。
ヒントとなりそうな事でも良いので、どなたかアドバイスして頂けたら助かります。

表示されるErrormessageは
TypeError: unsupported operand type(s) for 'NoneType' + 'NoneType'
です。

該当のソースコード

python3.6

1resiseq = [] 2cs = [] 3for model in structure.get_list(): 4 for chain in model.get_list(): 5 for residue in chain.get_list(): 6 if residue.get_resname() in aminopool: 7 resiseq.append(residue.get_resname())☜ここは上手くいきます 8 if cs == []: 9 for residue in chain.get_list(): 10 if residue.get_resname() in aminopool: 11 coor = [] 12 xsum = 0 13 ysum = 0 14 zsum = 0 15 for atom in residue.get_list(): 16 coor.append(atom.get_coord())☜ここから上手くいきません([]のままです) 17 xsum += coor[-1][0] 18 ysum += coor[-1][1] 19 zsum += coor[-1][2] 20 resix = xsum/len(coor) 21 resiy = ysum/len(coor) 22 resiz = zsum/len(coor) 23 resicoor.append([resix,resiy,resiz]) 24 del coor #1度消さなければ上手くappend出来ないため! 25 cs.append(resiseq) 26 del resiseq 27 resiseq = [] 28#Errormessageについて尋ねられたのでErrorが生じる場所まで追記します。該当する部分が分からないためにコードが長くなってしまい申し訳ありません 29maxx = None 30maxy = None 31maxz = None 32minx = None 33miny = None 34minz = None 35for c in resicoor: 36 x = c[0] 37 y = c[1] 38 z = c[2] 39 try: 40 if x > maxx: 41 maxx = x 42 if x < minx: 43 minx = x 44 if y > maxy: 45 maxy = y 46 if y < miny: 47 miny = y 48 if z > maxz: 49 maxz = z 50 if z < minz: 51 minz = z 52 except TypeError: 53 maxx = x 54 minx = x 55 maxy = y 56 miny = y 57 maxz = z 58 minz = z 59point = [(maxx + minx)/2,(maxy+miny)/2,(maxz+minz)/2] 60????ここでTypeError: unsupported operand type(s) for 'NoneType' + 'NoneType'が生じます。 61 62例外処理がしっかりなされていた場合、xやyがNonetypeでない限りこのような事にはならないと思いxやyに値を代入する前の元のリストresicoorを見ると[]になっていたため、ここに原因があると思っていたのですが…

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

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

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

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

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

tachikoma

2018/05/31 12:06

エラーメッセージ追記しといてもらえます?
onomu-

2018/06/01 02:31

追記いたしました。指摘して下さりありがとうございます
guest

回答1

0

ベストアンサー

テキストスクリプトでまとめて実行する場合とpythonシェル(ipython)で数行ずつ実行(for文の塊レベル)する場合の動作の違い

なんて基本的にはないんですけど・・・インデントがずれた、コードを打ち間違えた、pythonのバージョンが違ってた等の事態が発生した可能性が濃厚なのでは。

あと、数行ずつ実行というのはよくわかりません。ぜんぶネストされているので、forの塊ごとに切り分けるなんてことはできないと思いますが・・・。

投稿2018/05/31 11:56

編集2018/05/31 11:57
hayataka2049

総合スコア30933

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

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

onomu-

2018/06/01 02:28

数行ずつ実行というのは ipythonにおいて In[116]: for j in list1: for i in factor1: list2.append(i) print(i) Out[116]: iの羅列 というように複数の行を1度にinputするという事を表現したくて使いました。 言葉の表現が至らず申し訳ありません。 他の情報群Xでは自分が欲しいデータを獲得する事が出来たので、pythonのバージョンが違っていたという可能性は無いとは思いますが、コードの打ち間違えで自分が思っていたのとは違う動作をもたらしていた可能性は否めないのでよく検討してみたいと思います。 アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問