【问题标题】:List Comprehension and traversing through a list [duplicate]列表理解和遍历列表[重复]
【发布时间】:2016-05-02 12:24:01
【问题描述】:
[k for k in range (1,42) if k%2 != 0]

输出:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41]

现在,我想做到:

[-1, 3, -5, 7, -9, 11, -13, 15, -17, 19, -21, 23, -25, 27, -29, 31, -33, 35, -37, 39, -41]

所以我尝试了:

def test(N):
    k = []
    for i in range (1,N+1):
        if(i%2 != 0):
            k.append(i)
    for b in k[::2]:       <--- it changes the value but doesn't update the list
        b = -b
    return k
test(43)

关于如何解决这个问题的任何想法或建议?或者另一个问题是,如何在将元素更新为负值的同时遍历列表中的偶数索引

【问题讨论】:

  • 也许用k%4做点什么
  • 如果你学过微积分的话,看起来就像一个交替的系列。尝试乘以(-1)**(k + 1)

标签: python python-3.x list-comprehension


【解决方案1】:
[k if k%4==3 else -k for k in range (1,42) if k%2 != 0]

【讨论】:

    【解决方案2】:

    b 是对存储在 k 中的(不可变)整数的引用。通过将 b 更新为等于 -b,您并没有修改列表,您只是将 int 2 对象的 b 引用的内容更改为 int -2 对象。在构建列表时,您最好只做否定:

    def test(N):
        k = []
        for i in range (1,N+1, 2): # i increases in steps of 2
            if i % 4 == 1:
                i = -i
            k.append(i)
        return k
    
    test(43)
    

    【讨论】:

      【解决方案3】:

      这行得通:

      numbers = (k for k in range(1, 42) if k%2 != 0)
      [x * [-1, 1][n % 2] for n, x in enumerate(numbers)]
      

      输出:

      [-1, 3, -5, 7, -9, 11, -13, 15, -17, 19, -21, 23, -25, 27, -29, 31, -33, 35, -37, 39, -41]
      

      性能

      Malik Brahimi 在评论中建议,使用模数的方法比交替系列的方法快一点:

      %%timeit
      numbers = (k for k in range(1, 420000) if k%2 != 0)
      [x * (-1)**(n + 1) for n, x in enumerate(numbers)]
      1 loops, best of 3: 263 ms per loop
      
      %%timeit
      numbers = (k for k in range(1, 420000) if k%2 != 0)
      [x * [-1, 1][n % 2] for n, x in enumerate(numbers)]
      1 loops, best of 3: 210 ms per loop
      

      【讨论】:

      • 如果你学过微积分的话,看起来就像一个交替的系列。尝试乘以(-1)**(k + 1)
      • @MalikBrahimi 感谢您的提示。为不同的方法添加了一些性能测量。
      • @MikeMüller 这是一个非常复杂的列表理解!不过谢谢!
      猜你喜欢
      • 2014-07-06
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2014-11-22
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多