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

Posted

技术标签:

【中文标题】二维数组 Python 问题,if 范围,elifs,一个没有按预期工作【英文标题】:2d array Python question, range of if, elifs, one not working as expected 【发布时间】:2022-01-19 21:55:00 【问题描述】:

我有以下程序,其中用户输入一个数字,一个 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()

【问题讨论】:

您的 if-elif 语句应该是从最低数字到最高数字。另外,matrix[0][0] 应该是 matrix1[0][0] 【参考方案1】:

您的 el-if 语句应如下所示。在您的实现中,当用户输入 0 作为输入数字时,代码将执行 if number &lt;=7 语句。所以,if number&lt;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"

...

【讨论】:

试过了 - 它仍然没有在二维数组的第 0 个位置放置一个 X。见这里trinket.io/python/cdcba8b69d 你应该matrix1[0][0]=="X"matrix1[0][0]="X"。我编辑了答案。 太棒了。我有一个问题。将粘贴在这里 ***.com/questions/70385478/…【参考方案2】:

如果number &lt; 1,则number &lt;= 7,因此if 语句中的第一个条件将在到达number &lt; 1 检查之前应用。在这种情况下,余数是0,因此它将索引matrix1[0][-1],这是该行中的最后一项。您应该将 number &lt; 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"

【讨论】:

你能发布一个解决方案吗 太棒了,谢谢> 另一个问题:***.com/questions/70385478/…【参考方案3】:

您可以更简单地做到这一点,只需对第一个索引使用 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)

【讨论】:

你能解释一下吗?比如说“14”。 matrix1[number // 7][number % 7] = "X" number//7 = 2 and number%7 = 0。这应该把X放在第2行和位置0? .... 完全正确; 14 // 7214 % 70。正如我所说,如果您想将所有内容都转移,以便 14 位于matrix[1][6](这就是您的代码的工作方式,但它在拐角处存在一些问题),只需减去 1。 是的,但是 matrix1[2][0] - 不会把它放在第十四位吗?这不是第 2 行和第 2 行中的第一个元素,而不是第 2 行中的第 7 个元素。请问我错过了什么? 如果你从0 开始数(这是大多数编程语言的工作方式),那么14 是第十五位,而不是第十四位。 (使其成为第三行中的第一个单元格,即matrix1[2][0]。)再次:如果您想从 1 中计数,则减 1。 :) 您最初的问题不是很清楚您希望每个数字如何准确地映射到矩阵中的某个位置,甚至哪些数字范围被认为是有效的。 Samwise - 很棒但是 - 注意它不适用于 0

以上是关于二维数组 Python 问题,if 范围,elifs,一个没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

用python做个猜数字的小游戏用if和elif语句来引导

Python构建二维数组获取列表分配索引超出范围

Python if、elif、else 链替代方案 [重复]

求python 中if 里如何设定一个值的范围

python 中if和elif的区别

if/elif/else 语句中的python 2.7.6 isupper 函数