【问题标题】:simple 2d input in python [duplicate]python中的简单二维输入[重复]
【发布时间】:2020-12-20 12:42:53
【问题描述】:

我需要输入二维数组并对其进行更改,但答案总是错误的。这是我的代码。

r,c,obs = map(int, input().split())
k = []
h = []
for i in range(r):
    for j in range(c):
        k.append(0)
    h.append(k)

for i in range(r):
    for j in range(c):
        print(h[i][j],end=" ")
    print()

while obs > 0:
    l, k = map(int, input().split())
    h[l-1][k-1] = 1
    obs -= 1

for i in range(r):
    for j in range(c):
        print(h[i][j],end=" ")
    print()

我的输入是这样的 -

5 4 4
3 2
3 4
4 2
5 2

根据代码,我的结果矩阵应该是这样的 -

0 1 0 0 
0 1 0 0 
0 1 0 1 
0 0 0 0 
0 0 0 0

但它总是导致这个 -

0 1 0 1 
0 1 0 1 
0 1 0 1 
0 1 0 1 
0 1 0 1

谁能告诉我这里出了什么问题??

【问题讨论】:

  • h.append(k) 重复地将 referrnces 附加到 h 的同一个数组,而不是独立的数组。
  • 提示:h[0] == h[1]h[0] is h[1]

标签: python arrays python-3.x list


【解决方案1】:

我猜你忘了在外部 for 循环的每次迭代结束时重置 k。这个怎么样?

r,c,obs = map(int, input().split())
h = []
for i in range(r):
    k = []             # This is the only line changed.
    for j in range(c):
        k.append(0)
    h.append(k)

for i in range(r):
    for j in range(c):
        print(h[i][j],end=" ")
    print()

while obs > 0:
    l, k = map(int, input().split())
    h[l-1][k-1] = 1
    obs -= 1

for i in range(r):
    for j in range(c):
        print(h[i][j],end=" ")
    print()

结果是

0 0 0 0 
0 0 0 0 
0 1 0 1 
0 1 0 0 
0 1 0 0 

【讨论】:

  • 干得好...!你搞定了,而不是像我一样绕圈子.. 愚蠢的我:/
  • 很好的答案,感谢您修复我的代码
【解决方案2】:

解释

你的打印方式很破旧,看看这个:

r,c,obs = map(int, input().split())
k = []
h = []
for i in range(r):
    for j in range(c):
        k.append(0)
    h.append(k)
def print_arr(k1):
    for li in k1:
        for it in li:
            print(it,end=' ')
        print()
print_arr(h)
while obs > 0:
    l, k1 = map(int, input().split())
    h[l-1][k1-1] = 1
    obs -= 1
    print_arr(h)

输入:

>? 5 4 4
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

>? 3 2
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

也是因为:

for i in range(r):
    for j in range(c):
        k.append(0)
    h.append(k)

oyu 所做的是将相同的列表分配给 h,并且它包含相同的列表 c 次,并且您对任何内部列表所做的每次更改都会更改每一列(例如包含的内部列表)

解决方案

解决这个问题的方法是,改变:

for i in range(r):
    for j in range(c):
        k.append(0)
    h.append(k)

到:

for i in range(r):
    k=[]
    for j in range(c):
        k.append(0)
    h.append(k)

输出:

>? 5 4 4
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0 
>? 3 2
0 0 0 0 
0 0 0 0 
0 1 0 0 
0 0 0 0 
0 0 0 0 

【讨论】:

  • @SAM GARAI - 你没有像你想象的那样创建二维矩阵。您可以将这些行更改为:(在 k = []; h = [] 之后)并尝试一下。从您的原始代码中,您只需创建一维数组 h - 引用相同的数组 k。 ```python k = [0 for i in range(c) for i in range(r)]; h = [[0 for i in range(c)] for i in range(r)]
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多