函数适用于命令行,但不适用于脚本

时间:2017-06-14 00:46:46

标签: python python-3.x command-line pygraphviz

我在自己的名为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。

1 个答案:

答案 0 :(得分:0)

Python 3&#39; s input返回str,它不会解析它来制作Python数据结构只是因为内容看起来像Python文字。在这种情况下,如果您希望能够输入list list int的{​​{1}}字面值,我建议您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可以在不允许任意代码执行的情况下为您提供所需的内容。