我想从迭代器中获取所有最大值:
def max_val(iterator, key=None):
# ???
it = (i for i in range(4))
assert max_val(it, key=lambda i: i%2) == [1, 3]
注意:此问题类似于list
的{{3}}。
与上一个问题存在2个不同之处:
1)我希望这适用于迭代器,因此我不能使用asked before,这是列表问题中最快和最简单的解决方案。
2)我想获得最大值而不是索引。这可能听起来很奇怪,但是如果我在上面的示例中指定一个键参数(或者如果对象仅根据其内部状态的一部分进行排序),这将非常有用。
一个解决方案是对列表问题略微修改了@martineau 2-pass approach(它需要存储值而不是索引),但我想知道是否有更快的方法。
答案 0 :(得分:1)
def max_val(iterator, key=None):
try:
ret = [iterator.next()]
except StopIteration:
return []
for val in iterator:
if key(val) < key(ret[0]):
continue
elif key(val) == key(ret[0]):
ret.append(val)
else:
ret = [val]
return ret
一遍,传递你的断言。
它只是保持最佳状态,直到找到一个好的,然后重新开始。