[英]Functions works on command line, but not in script
我在自己的名為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。
Python 3的input
返回一個str
,它不會將其解析為一個Python數據結構,只是因為其內容看起來像一個Python文字。 在這種情況下,如果您希望能夠輸入int
s文字list
的list
,我建議使用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
您的需求,而無需執行任意代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.