【问题标题】:Python: Simplifying selection statements to using a loopPython:将选择语句简化为使用循环
【发布时间】:2022-01-19 22:12:26
【问题描述】:

我有以下代码,出于教学目的,我想从这里简化为使用迭代。我希望学生能够看到任何重复(例如模式)并使用 for 或 while 循环来实现这一点。

解决这个问题的最佳方法是什么?

https://trinket.io/python/5e56cf6a5c

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<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"



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

根本不使用迭代,建议这样做:

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()

我无法理解以下内容:

比如说“14”。 matrix1[number // 7][number % 7] = "X" number//7 = 2 and number%7 = 0。这应该把X放在第2行和位置0?

【问题讨论】:

  • 它确实将 14 放入 matrix1[2][0]
  • 关于您的跟进:该建议并不完全正确。你应该做matrix1[(number-1)//7][(number-1)%7] = 'X'。对于“14”,您最终会修改第 1 行的位置 6。
  • 就在附近 - 但不适用于 0 trinket.io/python/a19b22da26
  • @Compoot 也许我对所需的行为感到困惑。我想如果number是n,那么我们要改变从左上角开始的第n个条目来改变。如果是这样,那我们为什么会期望收到输入“0”?
  • @Compoot 饰品使用 Python 2。您使用的是 python 2 还是 python 3?

标签: python loops if-statement


【解决方案1】:

这不使用任何循环,但也许这种简化是您想要的。

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
  q,r = divmod(number-1,7)
  
  matrix1[q][r] = 'X'



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

另外,这是打印该矩阵的一种更漂亮的方法。

for row in matrix1:
    print(*row)

在 Python 2 中:

for row in matrix1:
    print(' '.join(row))

这是 Python 3 版本的trinket link

样本输出:

---The Matrix---
Enter number:8
* * * * * * *
X * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

【讨论】:

  • 漂亮! .....但它不适用于 0
  • @Compoot 查看我的其他 cmets。如果我们输入 0 会发生什么?什么是“第 0”项?如果有第 0 个条目,那为什么还有第 49 个条目?
【解决方案2】:

您不需要执行remainder-1,因为remainder=number%7 总是返回一个介于 0 和 6 之间的值。

0%7 = 0
1%7 = 1
...
6%7 = 6
7%7 = 0

这解决了您的根本问题。

【讨论】:

    【解决方案3】:

    你可以像这样使用循环:

    def matrix():
        print("---The Matrix---")
        #create a 1d array of 7 stars
        matrix1=[
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"],
        ["*","*","*","*","*","*","*"]
        ]
        #user enters a number
        number= int(float(input("Enter number:")))
        
        #you are always finding the remainder on each row to place the X
        
        #an 'X' is placed in the position of the number
        #remainder-1 because we start at index 0
        
        for i in range(1,len(matrix1)+1):
            for j in range(1,len(matrix1)+1):
                if i * j == number:
                    matrix1[i-1][j-1] = "X"
    
    
    
        #the updated matrix is printed.
        print(matrix1)
    matrix()
    

    【讨论】:

    • 伟大的尝试....几乎可以工作,但不完全。用输入 2 试试吧
    • @Compoot 它仍然适用于我的输入为 2。
    【解决方案4】:

    如您所说,它将 14 放入第 2 行第 0 列。 您的实现有错误。例如,0 和 1 具有相同的输出。因此,通常如果您使用零索引,建议的代码是完美的。

    当我们为您的实现提供 14 时,由于 el-if 语句,它假定它位于第 1 行。 matrix1[1][remainder-1]变成matrix1[1][-1] 然后它将 X 放到行的最后一个元素。 python 的 -1 功能表明您的实现是正确的。但事实并非如此。

    如果您使用零索引,建议的实现是正确的。如果你说它应该从 1 开始,那么你的循环实现也是错误的。

    【讨论】:

      【解决方案5】:

      如果使用 2D 数组不是关键部分,那么更好的选择是对单个列表进行简单替换,并使用其他函数来设置输出样式。这里我们使用textwrap将文本分割成7个字符长的行:

      import textwrap
      
      def matrix():
        print("---The Matrix---")
        # Create a list of '*', 49 items long
        matrix1= ["*"] * 49
        #user enters a number
        number=int(input("Enter number:"))
      
        # Update the list element in that position
        matrix1[number] = "X"
      
        #the updated matrix is printed.
        print('\n'.join(textwrap.wrap(''.join(matrix1), 7)))
      
      matrix()
      

      诚然,这也意味着不涉及循环或迭代,这可能会破坏练习的重点......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多