2017-06-14 29 views
0

以下の関数は、MTG.pyという独自のファイルで定義されています。隣接行列を入力とし、グラフを作成することになっています。関数はコマンドラインで動作しますが、スクリプトでは動作しません

import pygraphviz as pgv 
import numpy as np 

def matrix_to_graph(M): 
    A = pgv.AGraph() 
    for i in range(0, np.shape(M)[0]): 
     for j in range(0, np.shape(M)[0]): 
      if i < j and M[i][j] == 1: 
       A.add_edge(i,j) 
    A.write('M.dot') 
    C = pgv.AGraph('M.dot') 
    C.layout() 
    C.draw('M.png') 

私はM.pngに印刷された正しいグラフであるコマンドライン

from MTG import matrix_to_graph 
M = [[0, 1, 0, 1, 1], [1, 0, 1, 1, 0], [0, 1, 0, 0, 0], [1, 1, 0, 0, 1], [1, 0, 0, 1, 0]] 
matrix_to_graph(M) 

私は私が望む正確に何を得る、から実行します。しかし

、私は(インデントなしで、つまり関数の定義外で)上記のコードに追加した場合

M = input("Enter an adjacency matrix:") 
matrix_to_graph(M) 

私はエラー

for i in range(0, np.shape(M)[0]): 
IndexError: tuple index out of range 

を取得し、私はこれが原因で起こっていると想像入力関数は私がと考えるとは行列ですが、実際にはなのでです。私はこれをnp.matrix(M)を使って修正しようとしましたが、それは1x16ベクトルで私の行列を変えます。私はPythonには新しく、これをもっとうまくやるための1000の方法があると確信していますが、なぜこの特定の方法が機能していないのか理解したいと思っています。

私はPyCharm 2017.1.3(コミュニティ版、それが重要な場合)とPython 3.6を使用しています。

答えて

0

Python 3のinputは、strを返します。内容がPythonリテラルのように見えるため、Pythonデータ構造を作成するために解析しません。このケースでは、のlistlistのを入力することができるようにしたい場合はintのリテラル、私は(安全に)list自体にリテラル行列を表す文字列へ変換するusing ast.literal_evalをお勧めします:

import ast 

M = ast.literal_eval(input("Enter an adjacency matrix:")) 

あなたはおそらくPython 2に慣れていて、inputはPython 3でeval(input(...))を実行することと同等でしたが、inputのバージョンは正当な理由のため危険でした。 ast.literal_evalは、任意のコード実行を許可せずに必要なものを取得します。

+0

私は問題がどこから来たのか分かっていてうれしく、修正が本当に簡単だったことも嬉しいです。ありがとう。 – Trevor

関連する問題