【问题标题】:Python list reversed can't be accessed more than oncePython list reversed 不能被多次访问
【发布时间】:2021-06-13 08:43:23
【问题描述】:

谁能给我解释一下?

import numpy as np

arr = reversed(np.arange(11))

print(list(arr))


print(list(arr))

print(list(arr))

这段代码的输出是:

为什么我不能多次访问 arr 变量?

【问题讨论】:

    标签: python python-3.x numpy array-broadcasting numpy-ufunc


    【解决方案1】:

    reversed 返回一个iterator。当你第一次调用list 时,你一直迭代到最后,它再也没有什么可以回馈的了。因此,如果您再次调用 list,它会立即显示“停止迭代”并且您会得到一个空列表。

    修复是在你第一次调用list时存储它:

    >>> arr = list(reversed(np.arange(11)))
    >>> arr
    [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    不过,在 numpy 的上下文中,您不会强制转换为 list,而是在 numpy 域中反转:

    >>> arr = np.arange(11)[::-1]
    

    >>> arr = np.arange(10, -1, -1)
    

    >>> arr = np.flip(np.arange(11))
    

    >>> arr = np.flipud(np.arange(11))
    

    得到

    >>> arr
    array([10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0])
    

    【讨论】:

    • 有没有办法重置迭代器或者它们只是一个镜头对象?
    • @DrBwts 一枪是的。一旦用尽(如果有的话),您需要重新生成。或者您可以使用 itertools.tee 之类的东西来开始使用超过 1 个生成器。
    【解决方案2】:

    reversed 方法

    返回给定序列值的反向迭代器

    一旦迭代器被消耗,它就是空的


    如果你消费它并存储在一个列表中,那么你可以多次使用它

    import numpy as np
    
    arr = list(reversed(np.arange(11)))
    print(list(arr))  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    print(list(arr))  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    print(list(arr))  # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    

    【讨论】:

      【解决方案3】:

      这与reversed() 的返回有关。你预计它是一个列表,但它是一个迭代器

      import numpy as np
      
      arr = reversed(np.arange(11))
      
      >>> print(list(arr))
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      >>> print(list(arr))
      []
      >>> print(list(arr))
      []
      

      首次运行后,迭代器为空。您可以通过从迭代器创建一个列表然后打印它来防止这种情况:

      arr2 = list(reversed(np.arange(11)))
      >>> print(list(arr2))
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      >>> print(list(arr2))
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      >>> print(list(arr2))
      [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      

      【讨论】:

      • 您不必在打印时转换为list。你在第一行转换了arr2 = list(reversed(np.arange(11)))
      • 我知道,你说得对。我只是想使用与 OP 相同的打印...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多