【问题标题】:Write an generator/iterator expression for this sequence为这个序列写一个生成器/迭代器表达式
【发布时间】:2021-12-01 21:03:14
【问题描述】:

我有一个我无法理解的练习

假设给定一个整数列表 X。我们需要构造该列表中元素的索引(位置)序列,该序列等于最大元素。序列中的索引按升序排列。

提示使用枚举器函数

from typing import Iterator
X = [1,10,3,4,10,5]
S : Iterator[int] = YOUR_EXPRESSION
assert list(S)==[1,4]

这是我唯一能想到的,但肯定不会返回 [1,4]

如果您想知道我不明白的地方,阅读描述并不清楚它如何返回 [1,4]。

也许你想先向我解释一下……

这是我的(错误)解决方案

my_enumerate=enumerate (X)
my_enumerate=(list(my_enumerate))
my_enumerate.sort(reverse=True)

【问题讨论】:

  • 首先解决如何在不变异(排序)的情况下找到列表中的最大值。

标签: python enumerate


【解决方案1】:

所以你有包含[1,10,3,4,10,5] 的列表X。最大或最大的元素是 10。这意味着我们应该返回找到 10 的所有索引的列表。索引 1 和 4 分别有两个 10。

使用 enumerate 可以在每次迭代时获得索引和元素。您可以使用它来过滤掉不需要的元素。在这种情况下,列表推导很有用,允许使用 if 语法进行过滤,即[val for val in items if some_condition]

【讨论】:

  • 好的,可以使用,但为什么它说序列中的索引按升序排列。
  • 这似乎过于具体。我猜想枚举,然后对值进行排序并只保留最大的值可能会导致索引无序并“破坏”规则。
【解决方案2】:

你可以使用这样的生成器

max_val=max(X)
s = (i for i, v in enumerate(X) if v==max_val)

【讨论】:

  • 如果您预先计算 max 一次,而不是在列表的每次迭代中,这将更有效。
  • @match 已编辑。谢谢
【解决方案3】:

这是我的解决方案

( x[0] for x in enumerate (X) if x[1] == max(X) ) 

这是本书的解决方案

(i for (i, n) in enumerate(X) if n == max(X))

【讨论】:

  • 这个问题是max(X)X 上的每次迭代都会重新计算。这使其效率低下。这本书应该提到这一点并提供改进的版本,其中max(X) 只被评估一次。
【解决方案4】:

这需要两个步骤:

  • max确定最大值
  • 迭代列表的索引并保留具有此最大值的索引

为了避免糟糕的时间复杂度,有必要不要重复第一步:

S : Iterator[int] = (lambda mx: 
    (i for i, x in enumerate(X) if x == mx)
)(max(X))

之所以以如此丑陋的表达方式呈现代码,是因为在问题中似乎要求遵循模板,并且只更改标有“YOUR_EXPRESSION”的部分。

如果没有这种人为的约束,你不会这样写。您只需执行 mx = max(X),然后在下一条语句中将迭代器分配给 S,而无需此内联 lambda。

【讨论】:

  • 天哪,为什么不直接做mx = max(X)
  • 因为在问题中建议必须遵循样板代码,要填写的部分是YOUR_EXPRESSION...我没有投票支持该模板;-)
  • 啊,我明白了。我怀疑最好解释一下通常你只会做mx = max(X) 但是模板约束会阻止你编写惯用代码
  • 现在已记录在 cmets 中。但我现在也将它添加到我的答案中。
猜你喜欢
  • 2021-08-13
  • 2014-03-23
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多