如何从标准输入读取矩阵?

时间:2016-03-18 21:03:36

标签: python

我试图从标准输入(控制台)读取输入但我的代码只读取行中的第一个数字

x=input("enter the matrix?")
print(read_matrix(x))

def read_matrix(matrix):
    list_of_lists = []
    for line in matrix:
        new_list = [int(elem) for elem in line.split()]
        list_of_lists.append(new_list)
    return list_of_lists

3 个答案:

答案 0 :(得分:2)

假设您使用的是Python 2.7,问题在于您使用input来处理用户键入的输入。实际上,如果查看相关文档(https://docs.python.org/2/library/functions.html#input),您可以看到基本上input对应eval(raw_input()),这意味着表达式参数被解析并作为Python表达式进行求值。 如果要将标准输入作为字符串读取,则应使用raw_input

如果您使用的是python 3,那么input就可以了。

但请注意,您应该以这样的方式格式化输入字符串:read_matrix可以识别同一行中的元素,以及何时应添加新行。

一种可能的解决方案(适用于python 2.7),保留代码的结构并假设输入的格式在同一行中的数字由空格分隔,行以';'分隔(例如,1 2 3; 4 5 6; 7 8 9),是:

def parse_numbers_list(formatted_string):
    list_of_lists = [map(int, row.split()) for row in formatted_string.split(';')]

    return list_of_lists

x = raw_input("enter the list of lists of numbers?")
print(parse_numbers_list(x))

对于python 3,同样:

def parse_numbers_list(formatted_string):
    list_of_lists = [list(map(int, row.split())) for row in formatted_string.split(';')]

    return list_of_lists

x = input("enter the list of lists of numbers?")
print(parse_numbers_list(x))

请注意,我更改了函数的名称,通常,代码不会检查输入字符串是否符合矩阵约束 - 即每行的列数相同。您可以添加一个检查,以查看每个列表是否具有相同的大小。

此外,完整的解决方案应包括检查输入字符串是否格式良好。

当然,有很多其他方法可以实现代码从标准输入读取矩阵,包括使用外部库,例如numpy,但我认为,当你学习Python时,很好你是从基础开始的。

答案 1 :(得分:0)

您的代码有两个问题。首先,你没有办法让细胞分开。如果某人为第一行输入112,则将其解释为[1],[1],[2],因为它们可能意味着任何一些事情。要修复此行,可以将其更改为

new_list = [int(elem) for elem in line.split(',')]

这将导致它用逗号分割单元格。 第二个问题是按Enter键告诉解释器你已完成输入。有两种解决方案。您可以让用户输入矩阵尺寸并使用for循环让它们进入每一行,或者您可以使用Matlab的语法,其中输入2x2矩阵作为[[a,b],[c,d]]。

答案 2 :(得分:0)

从您的示例代码中,您似乎正在使用列表列表来聚合您的数据......无限循环可以突破某些内容 生成这样一个数据结构---打破输入循环我使用了try-except子句,因为在我看来最自然的事情就是使用EOF来表示输入的结束,但是你可以使用任何其他可能的机制。

In [14]: def read_matrix():
    print('Input 1 row per line, with numbers separated by spaces.\n',
          'Use a C-d to stop input.')
    matrix = []
    while True:
        try:
            matrix.append([int(n) for n in input().split()])
        except EOFError:                                    
            return matrix
   ....:         

In [15]: read_matrix()
Input 1 row per line, with numbers separated by spaces.
 Use a C-d to stop input.
1 2 3
4 5 6
Out[15]: [[1, 2, 3], [4, 5, 6]]

当然我输入了一个C-d(在新行上,被解释器吃掉)来停止输入循环。

该函数过于紧凑,您可能更喜欢展开列表推导的元素,并可能在更新matrix

之前添加一些一致性检查(列数可能?)
In [18]: def read_matrix(nc):
    print('Input 1 row per line, with %d numbers separated by spaces.\n'%nc, 
          'Use a C-d to stop input.')
    matrix = []
    while True:
        try:
            line = input()
            numbers = [int(n) for n in line.split()]
            if not len(numbers) == nc:
                print('Wrong number of columns, repeat this line')
                continue
            matrix.append(numbers)
        except EOFError:
            return matrix
   ....:         

In [19]: read_matrix(3)
Input 1 row per line, with 3 numbers separated by spaces.
 Use a C-d to stop input.
1 2 3
4 5 6 7
Wrong number of columns, repeat this line
4 5 6
Out[19]: [[1, 2, 3], [4, 5, 6]]