使用迭代器对数组进行切片

Using iterator for slicing an array

我正在查看这段 python 代码,我需要一些解释:

arr = [0, 0, 0, 0, 1, 2, 3, 4,5]
arr = arr[next((i for i, x in enumerate(arr) if x != 0), len(arr)):]

此代码将从数组中删除前导零,我试图了解它是如何工作的。我知道我们创建了一个迭代器,它将遍历 arr 的所有元素但 0 个值,接下来只会迭代到数组的长度(不包括在内)。

但是next返回的这些索引是怎么组合成一个数组的呢?

让我们一步步看代码。你想切掉初始零。如果您知道第一个非零元素 n 的索引,表达式将类似于

arr = arr[n:]

这就是我们这里的基本情况,n = next((i for i, x in enumerate(arr) if x != 0), len(arr))

一般来说,next 的双参数形式会将 return 第二个参数作为标记,而不是在迭代器 运行 输出时引发 StopIteration。这就是 len(arr) 的用途。如果所有元素都为零,则表达式变为

arr = arr[len(arr):]  # obviously empty

如果存在非零元素,next 调用将找到它的索引(通过 enumerate 启用),然后 return 它。