【问题标题】:Multiplying only odd indexes in a for loop在 for 循环中仅乘以奇数索引
【发布时间】:2022-01-01 11:28:58
【问题描述】:

只用 for 循环乘以奇数索引 为什么它不起作用?

myList = [1, 2, 3, 4, 5]

index = 0
for num in myList:
    if index % 2 != 0:
        num *= 2
    index += 1

print(myList) # here the output still the same list

我希望输出为 [1, 4, 3, 8, 5]

【问题讨论】:

  • 请您选择一个答案

标签: python list for-loop


【解决方案1】:

编辑:我看到您已经编辑了您的问题,您在其中修复了第一个问题,即检查列表中的项目是否为奇数。但是,您仍在使用for num in myList 遍历列表,它在后台创建了一个Iterator,它在您的列表中移动。这意味着无论您对num 做什么,您都只是在修改num 而不是myList[index]。为了直接修改列表,您需要引用myList[index]。我强烈建议您考虑使用 enumerate,请参阅我的原始答案以了解如何将其应用于您的用例。

您的问题是您正在检查 myList 中的值是偶数还是奇数,而不是它的索引。

此外,在循环中修改 num 不会修改原始列表中的值(这很容易被注意到,因为在“修改”列表中奇数值没有相乘)。

使用range(len()) 成语循环遍历您的列表将产生以下代码:

myList = [1, 2, 3, 4, 5]

for idx in range(len(myList)):
    if idx % 2 != 0:
        myList[idx] *= 2

print(myList)

您可以使用enumeratelist comprehension 进一步缩短循环/分配:

myList = [1, 2, 3, 4, 5]

myList = [num * 2 if idx % 2 != 0 else num for idx, num in enumerate(myList)]

print(myList)

【讨论】:

    【解决方案2】:

    您的方法行不通,因为您没有将 'num' 分配回列表中。

    newList = [v*2 if idx % 2 != 0 else v for idx, v in enumerate(myList)]

    【讨论】:

      【解决方案3】:

      代码中有两个问题-

      • 您需要检查索引是奇数还是偶数,而不是元素。
      • 修改num 不会修改列表中的对应元素,因为它没有引用列表中的元素。
      myList = [1, 2, 3, 4, 5]
      
      for idx in range(len(myList)):
          if idx % 2 != 0:
              myList[idx]*=2
      

      【讨论】:

        【解决方案4】:

        我会使用自然列表语法L[start:stop:step]

        myList = [1, 2, 3, 4, 5]
        
        for i in mylist[1::2]:
            myList[i] = myList[i] * 2
        
        print(myList) # [1, 4, 3, 8, 5]
        
        

        【讨论】:

          猜你喜欢
          • 2016-10-24
          • 2019-05-02
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 2020-11-20
          • 2017-11-02
          • 2015-07-17
          相关资源
          最近更新 更多