2017-06-14 181 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') 

當我在命令行

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.png運行。

但是,如果我添加到上面的代碼(沒有縮進,即函數的定義之外)

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數據結構。在這種情況下,如果你希望能夠進入listlistint小號文字,我建議你向using ast.literal_eval(安全)從字符串轉換代表矩陣文字的list本身:

import ast 

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

您可能已經習慣了Python 2,其中input等同於在Python 3中執行eval(input(...)),但該版本的input很危險並且被刪除,原因很充分; ast.literal_eval在不允許任意代碼執行的情況下爲您提供所需的內容。

+0

我很高興我知道問題來自哪裏,更快樂的是,解決方案非常簡單。謝謝。 – Trevor

相關問題