使用迭代器对数组进行切片
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 它。
我正在查看这段 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 它。