查找迭代器生成的具有最大值的所有项目

时间:2016-12-15 01:42:31

标签: python python-3.x

我想从迭代器中获取所有最大值:

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(它需要存储值而不是索引),但我想知道是否有更快的方法。

1 个答案:

答案 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

一遍,传递你的断言。

它只是保持最佳状态,直到找到一个好的,然后重新开始。