【问题标题】:Python: While and For loopsPython:While 和 For 循环
【发布时间】:2021-05-25 01:02:44
【问题描述】:

请帮助我理解为什么我的代码没有按我希望的那样工作。当我在脑海中运行代码与控制台中的实际结果时,我无法匹配结果。很简单:

给定列表“num_list”,我想对奇数进行求和并显示结果,条件是它必须对列表中的前 5 个奇数进行求和。

结果= 85 + 719 + 85 + 17 + 191

num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]

result=0

odd_num=[]

count_odd=0

while count_odd < 5:
    for i in range(len(num_list)):
        if num_list[i]%2!=0:
            odd_num.append(num_list[i])
            count_odd+=1 
            result+=sum(odd_num)


print(result)

问题是while循环不会在count_odd &lt; 5处停止。

我正在学习最基本的知识,我想了解这里发生了什么。

谢谢

【问题讨论】:

  • result 是错误的。这是正确的:85 + 719 + 85 + 17 + 87

标签: python for-loop while-loop


【解决方案1】:

我发现您当前的代码存在一些问题,以及一些不必要的地方。

  • 不需要您的 while 循环,因为您使用了 `for range`。
  • 您不想在遍历列表时使用 `for range` 循环
  • 您只需将奇数附加到循环中的列表即可。然后在你的循环之外找到总和

    下面我已经修复了这些错误并清理了代码。

    num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]
    odd_num=[]
    count_odd=0
    for num in num_list:
        if count_odd == 5:
            break
        elif num%2!=0:
            odd_num.append(num)
            count_odd+=1 
    print(sum(odd_num))
    

    输出

    993
    
  • 【讨论】:

      【解决方案2】:

      您是否需要使用while 循环?否则,一个简单的解决方案是在 for 循环中添加 if 条件,例如

      num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]
      result=0
      
      odd_num=[]
      
      count_odd=0
      
      
      for i in range(len(num_list)):
        if count_odd < 5:
          if num_list[i]%2!=0:
            print(num_list[i])
            odd_num.append(num_list[i])
      
            count_odd+=1 
      
            result+=sum(odd_num)
      print(result)
      

      您的 while 循环中发生的情况是您的 while 循环运行了 5 次,这意味着您的 for 循环运行了 5 次,因此结果 = 85 + 719 + 85 + 17 + 191 计算运行了 5 次,即你不想要的东西。您想在 for 循环中检查您的计数,而不是让 for 循环运行 5 次。希望这是有道理的

      【讨论】:

        【解决方案3】:

        这是因为 for 循环完全完成了 while 循环的每次迭代,即使找到了 5 个赔率。您可以在每个循环结束时检查计数。

        while count_odd < 5:
            for i in range(len(num_list)):
                if num_list[i] % 2 != 0:
                    odd_num.append(num_list[i])
                    count_odd += 1 
                    result+=sum(odd_num)
                    if count_odd >= 5:
                        break
        

        或者您可以完全删除 for 循环。

        i = 0
        while count_odd < 5:
            if num_list[i] % 2 != 0:
                odd_num.append(num_list[i])
                count_odd += 1 
                result += sum(odd_num)
                print(count_odd)
            i += 1
        

        【讨论】:

          【解决方案4】:

          您只需要一个循环,while 循环。

          num_list = [422, 136, 524, 85, 96, 719, 85, 92, 10, 17, 312, 542, 87, 23, 86, 191, 116, 35, 173, 45, 149, 59, 84, 69, 113, 166]
          
          odd_num=[]
          
          count_odd=0
          
          i = 0
          
          while count_odd < 5:
             print(num_list[i])
             if num_list[i]%2!=0:
                odd_num.append(num_list[i])
                count_odd+=1 
             i += 1
          
          result = sum(odd_num)
          
          print(result)
          

          【讨论】:

            【解决方案5】:

            您可以使用列表推导式遍历列表,过滤掉所有偶数,使用列表切片选择前 5 个奇数,然后对它们求和。

            n = sum(list(filter(None, [i if i%2==1 else None for i in num_list]))[:5])
            

            print(n) 给出:

            993
            

            或 85 + 719 + 85 + 17 + 87 = 993(前 5 个奇数)

            【讨论】:

            • filter(lambda x: x%2 == 1, num_list) 会简单很多。
            • (i for i in num_list if i%2 == 1)
            • 您也不需要先将filter 实例转换为列表; sum 可以添加任意可迭代值。
            • 还需要在求和函数中画出来sum(list(filter(lambda x: x%2 != 0, num_list))[:5])
            • TypeError: 'filter' object is not subscriptable 你确实需要将其转换为列表,否则你将如何使用列表切片仅选择前 5 个项目?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-09
            • 1970-01-01
            • 2019-04-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多