从用户输入中获取二维列表

时间:2018-04-12 07:04:04

标签: python

CODE SNIPPET

n = int(raw_input())

a = [[0]*n]*n

for i in xrange(0,n):
    s = raw_input()
    for j in xrange(0,n):
        a[i][j] = int(s[j])

print a

我是python的新手。从stdin获取用户输入时,我在stdin中给出了以下值

  

3

     

101

     

010

     

101

但是当我打印时,输出为

[[1, 0, 1], [1, 0, 1], [1, 0, 1]]

而输出应为

[[1, 0, 1], [0, 1, 0], [1, 0, 1]]

有人可以指导我,我错过了什么吗?

我正在使用python 2.7。

4 个答案:

答案 0 :(得分:0)

a更改为:

a = [[0 for i in range(n)] for j in range(n)]

因为[[0]*n]*n每次都会创建一个实例,所以它会将最后一个赋值给所有实例,因为它们是相同的引用。它们在内存中都是完全相同的列表。当您使用[[0]*n]*n语法时,您得到的是n个[0]个对象的列表,但它们都是对同一个对象的引用。它们不是不同的实例,而是仅仅引用同一个实例。

答案 1 :(得分:0)

这是有问题的一行:

a = [[0]*n]*n

这违反直觉,只创建[0, 0, 0]的单个实例,并对其进行三次引用。这意味着每次都会被你的上一次输入覆盖。

你可以通过改写来解决它:

a = [[0 for _ in range(n)] for _ in range(n)]

答案 2 :(得分:0)

首先定义全范围的矩阵,如

a = [[0 for i in range(n] for i in range(n)] 
a[i][j] = any value

我希望它的工作

答案 3 :(得分:0)

尝试以下代码。显然你需要添加很多支票。

n_rows = int(raw_input('Enter Number of rows required: '))
n_cols = int(raw_input('Enter Number of cols required: '))

rows = []
for i in range(0, n_rows):
    row = int()

final_list = []
for i in xrange(0, n_rows):
    s = list(raw_input('Enter the values for row no. {} (Separated by commas): '.format(i+1)))
    s_list = [int(i) for i in s if i != ',']
    if len(s_list) != n_cols:
        raise ValueError('Number of values entered are not correct')
    else:
        final_list.append(s_list)

print final_list

或者您也可以尝试Numpy模块