使用枚举替换 None 值会得到相同的答案

Replacing None value using enumerate results in same answer

给定以下列表:

x =[None, None, 1, 2, None, None, 3, 4, None, 5, None, None]

问题要求我们用以前的值替换 None 个值。

当我 运行 在 Google Colab 中使用这两种解决方案时,它们得到了相同的答案:

x =[None, None, 1, 2, None, None, 3, 4, None, 5, None, None]
def replace(x):
  for i,v in enumerate(x):
    if x[i] is None:
      x[i]=x[i-1]
  return x


y =[None, None, 1, 2, None, None, 3, 4, None, 5, None, None]
def replace(y):
  for i,v in enumerate(y[:-1],1):
    if y[i] is None:
      y[i]=y[i-1]
  return y

以下两者 return:

[None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5]

我试图理解为什么这些解决方案是等价的。此外,考虑到等价性,枚举语句中 y[:-1] 的基本原理是什么?

谢谢。

enumerate 接受一个可选参数,允许我们指定计数器的起始索引。所以当你这样做时:

enumerate(y[:-1],1)

而不是:

enumerate(y)

你只是在移动索引:

0 None
1 None
2 1
3 2
4 None
...

1 None
2 None
3 1
4 2
5 None
...

总而言之,鉴于您的输入是 list,并且您使用 enumerate 添加了索引,但是您的输出是一个没有任何索引的列表,显然您看不出任何区别.

它们并不完全等价。第一个解决方案将使用列表中的最后一项替换索引 0 处的 None 值。第二个解决方案不替换索引零处的项目(假设它没有前任)。因此,根据问题陈述的措辞,其中一个解决方案可能是错误的。

在 python 中,当您有一个列表 x 并执行 x[:-1] 时,您正在创建一个没有最后一个元素的新列表。你问一个理由,但我真的看不出添加这个有什么帮助。

在第二个示例中从 1 开始枚举这一事实可能会给您带来一些奇怪的行为

如果您尝试以下列表:

x = [None, None, 1, 2, None, None, 3, 4, None, 5, None, 6]

您将得到接下来的两个结果:

[6, 6, 1, 2, 2, 2, 3, 4, 4, 5, 5, 6]
[None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 6]

这是因为枚举从 1 开始,所以您忽略了 y[0] = y[-1]

enumerate 有两个参数,一个 iterable 和一个 start。 当你写 enumerate( y[:-1], 1 ) 两个 事情发生:

  1. 您正在将 y 数组的 copy 切碎给 for 循环(您切碎了数组的最后一个元素) ,但在你的 for 循环中,你实际上在处理 real y 数组,它没有被切碎。 如果您在 for 循环之前将 y 设置为 y = y[:-1] 并将其提供给枚举( enumerate( y, 1 ) ),您将看到 list is out of index 错误。

  2. 当您给枚举一个 1 作为起始数字时,您实际上是在跳过 real y 数组的第一个元素(数组索引从 0 开始,并且您在 for 循环中以 y[1] 开始)。因此(并且因为 1.point )你将到达 real y 数组的最后一个元素。