二维数组 Python 问题,if 的范围,elifs,一个没有按预期工作

2d array Python question, range of if, elifs, one not working as expected

我有以下程序,其中用户输入一个数字,X 放在矩阵的位置。

出于教学目的,我正在尝试仅使用选择来解决它(目前)。

您会注意到它适用于除 0 以外的所有数字。最后一个 elif 用于小于 1 的数字 - 例如0. 代码告诉它把 X 放在位置 0,0,但它却把它放在 7。

这是怎么回事? https://trinket.io/python/987e8c46d7

注意,我只添加了最后一个 elif,因为第一个 elif 也应该处理小于 7 的数字,但它不起作用。我该如何使用相同的结构来处理这个问题。

然后我想在教学的基础上查看 if 语句并查看重复或不必要的复杂性区域,以表明它可以进一步简化以获得更优雅的代码。

def matrix():
  print("---The Matrix---")
  #create a 1d array of 7 stars
  matrix1=[
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"],
  ["*","*","*","*","*","*","*"]
  ]
  #user enters a number
  number=int(input("Enter number:"))
  #you are always finding the remainder on each row to place the X
  remainder=number%7
  
  #an 'X' is placed in the position of the number
  #remainder-1 because we start at index 0
  
  if number<=7:
    matrix1[0][remainder-1]="X"
  elif number>7 and number<15:
    matrix1[1][remainder-1]="X"
  elif number>14 and number<22:
    matrix1[2][remainder-1]="X"
  elif number>21 and number<29:
    matrix1[3][remainder-1]="X"
  elif number>28 and number<36:
    matrix1[4][remainder-1]="X"
  elif number>35 and number<43:
    matrix1[5][remainder-1]="X"
  elif number>42 and number<50:
    matrix1[6][remainder-1]="X"
  elif number<1:
    matrix[0][0]=="X"


  #the updated matrix is printed.
  print(matrix1)
matrix()

如果 number < 1,则 number <= 7,因此 if 语句中的第一个条件将在到达 number < 1 检查之前应用。这种情况下的余数是 0,因此它将索引 matrix1[0][-1],这是该行中的最后一项。您应该将 number < 1 检查移至 if 语句的开头以解决此问题。另外,我认为您在该代码中有错字,因为您访问的是 matrix 而不是 matrix1,并且您使用的是 == 运算符而不是赋值。

  if number < 1:
    matrix1[0][0] = "X"
  elif number<=7:
    matrix1[0][remainder-1]="X"
  elif number>7 and number<15:
    matrix1[1][remainder-1]="X"
  elif number>14 and number<22:
    matrix1[2][remainder-1]="X"
  elif number>21 and number<29:
    matrix1[3][remainder-1]="X"
  elif number>28 and number<36:
    matrix1[4][remainder-1]="X"
  elif number>35 and number<43:
    matrix1[5][remainder-1]="X"
  elif number>42 and number<50:
    matrix1[6][remainder-1]="X"

您的 el-if 语句应该如下所示。在您的实现中,当用户输入 0 作为输入数字时,代码进入 if number <=7 语句。所以,if number<1: 声明应该放在第一位。

...

  if number<1:
    matrix1[0][0]="X"
  elif number<=7:
    matrix1[0][remainder-1]="X"
  elif number>7 and number<15:
    matrix1[1][remainder-1]="X"
  elif number>14 and number<22:
    matrix1[2][remainder-1]="X"
  elif number>21 and number<29:
    matrix1[3][remainder-1]="X"
  elif number>28 and number<36:
    matrix1[4][remainder-1]="X"
  elif number>35 and number<43:
    matrix1[5][remainder-1]="X"
  elif number>42 and number<50:
    matrix1[6][remainder-1]="X"

...

您可以更简单地通过对第一个索引使用 int 除法而不是使用一堆 if 语句将每个范围单独映射到相同的结果:

def matrix():
    print("---The Matrix---")
    # create a 2d array of 7x7 stars
    matrix1 = [["*" for _ in range(7)] for _ in range(7)]

    number = int(input("Enter number: "))
    matrix1[number // 7][number % 7] = "X"

    # print the matrix
    print('\n'.join(''.join(row) for row in matrix1))


matrix()
---The Matrix---
Enter number: 0
X******
*******
*******
*******
*******
*******
*******
---The Matrix---
Enter number: 48
*******
*******
*******
*******
*******
*******
******X

如果您希望用户输入的数字为 1-49 而不是 0-48,只需在用户输入后从 number 中减去 1。您可以使用 minmax:

“剪辑”低于 1 和高于 49 的输入
number = int(input("Enter number: ")) - 1
number = max(number, 0)
number = min(number, 48)