【问题标题】:Using iterator for slicing an array使用迭代器对数组进行切片
【发布时间】:2020-01-23 02:35:38
【问题描述】:

我正在查看需要解释的这个 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,如何将这些索引组合成一个数组呢?

【问题讨论】:

  • 您认为这里到底有什么问题?执行完全相同的代码来创建 [1 2 3 4 5]
  • 可能是这样,但我仍然想了解它是如何工作的。
  • 没关系。我没有仔细阅读。答案来了

标签: python python-3.x iterator next object-slicing


【解决方案1】:

让我们一步一步看代码。你想切掉最初的零。如果您知道第一个非零元素的索引n,则表达式如下所示

arr = arr[n:]

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

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

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

如果有一个非零元素,next 调用将找到它的索引(使用enumerate 启用)并返回它。

【讨论】:

  • 出于某种原因,我认为 next 会返回一个迭代器,我的错。这很简单。我会把它标记为读者的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 2022-01-18
  • 2020-02-27
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多