在Python中查找相同迭代的最小值和最大值

时间:2014-11-17 21:52:17

标签: python max min

我有以下代码:

max=max(len(j.links) for j in roads.junctions())
min=min(len(j.links) for j in roads.junctions())

roads.junctions()返回一个包含近100万个联结的列表。 有没有办法在一行中找到同一次迭代中项目的最小值和最大值(而不是编写一个计算它们的函数)?

2 个答案:

答案 0 :(得分:6)

你不能在一行中获得最小值和最大值,但可以通过一个简单的循环来获取它们:

min_value, max_value = float('inf'), float('-inf')
for j in roads.junctions():
    value = len(j.links)
    if value < min_value:
        min_value = value
    if value > max_value:
        max_value = value

这会产生与min()max():O(N)具有相同复杂度的值,因此线性复杂度。它还单独查看每个值,不要求所有值都在内存中的单个列表中。

你总是可以将它包装成一个函数:

def min_and_max(iterable):
    min_value, max_value = float('inf'), float('-inf')
    for value in iterable:
        if value < min_value:
            min_value = value
        if value > max_value:
            max_value = value
    return min_value, max_value

min_value, max_value = min_and_max(len(j.links) for j in roads.junctions())

答案 1 :(得分:3)

必要的reduce单行(仅因为它在一行中可行):

min_v, max_v = reduce(lambda y,x: (min(len(x), y[0]), max(len(x), y[1])), roads.junctions(), (float('inf'), float('-inf')))

lambda接受一个具有长度和当前最小/最大元组的参数,并返回更新的元组。使用inf / -inf初始化元组,并将lambda应用于传递给reduce的iterable的所有项。