为这个序列写一个 generator/iterator 表达式

Write an generator/iterator expression for this sequence

这个练习我看不懂

假设我们有一个整数列表 X。我们需要构建此列表中等于最大元素的元素的索引(位置)序列。序列中的指标按升序排列。

提示使用枚举函数

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

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

如果你想知道我不明白的地方,从阅读描述中不清楚它是如何做到的 return [1,4].

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

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

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

你可以像这样使用生成器

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

这需要两个步骤:

  • 求最大值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。

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

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

这是我的解决方案

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

这是书中的解答

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