Python - 使用递归在嵌套列表中查找Max和Min的总和

时间:2016-02-24 16:06:48

标签: python recursion

这是我到目前为止所做的一切...... 我无法弄清楚我做错了什么

首先是我的助手功能

def max_min(l):

    if isinstance (l[0], list):
        result = max_min(l[0])

    elif len(l) == 2:
        if l[0] < l[1]:
            result = l[0], l[1]
        else:
            result = l[1], l[0]

    else:
        Min, Max = max_min(l[1:])
        if l[0] <= Min:
            result = l[0], Max
        elif l[0] >= Max:
            result = Min, l[0]
        else:
            result = Min, Max

    return result

试图这样做时

l = [6, 3, 7, 5, 5, 2, [3, 2], 1]
print max_min(l)

它给了我(2, 7)我希望(1, 7)

我没有想法......任何人都可以指出我的方向吗?

4 个答案:

答案 0 :(得分:4)

当程序到达嵌套列表时,它会停止评估其他元素。块if isinstance (l[0], list)确保如果存在嵌套列表,则不会评估其余元素,因为永远不会调用Min, Max = max_min(l[1:])

您可以使用以下内容修复if块:

if isinstance (l[0], list):
    Nested_Min, Nested_Max = max_min(l[0])
    Remainder_Min, Remainder_Max = max_min(l[1:])
    Min = Nested_Min if Nested_Min < Remainder_Min else Remainder_Min
    Max = Nested_Max if Nested_Max > Remainder_Max else Remainder_Max
    result = Min, Max

您还应该将if len(l) == 2的支票替换为:

if len(l) == 1:
    result = l[0], l[0]

这样,单个元素列表的功能不会失败。最后,在开头添加如下内容:

if not l:
    return ()

答案 1 :(得分:0)

请改为尝试:

def min_max(l):
    if isinstance(l, list):
        t = [min_max(v) for v in l]
        return min([m[0] for m in t]), max([m[1] for m in t])
    else:
        return l, l

示例输出:

>>> l = [6, 3, 7, 5, 5, 2, [3, 2], 1]
>>> min_max(l)
(1, 7)
>>>

请注意,空列表或子列表会导致错误,因此如果您愿意,可能需要添加一个检查。

答案 2 :(得分:0)

要扩展我的注释,你仍然需要使用递归来展平列表,因为你有一个整数和列表的混合,代码看起来如下:

def flatten(l):
    tmp = []
    for i in l:
        if isinstance(i, int):
            tmp.append(i)
        elif isinstance(i, list):
            tmp += flatten(i)
        else:
            raise AttributeError("found unexpected type {t}".format(t=type(i)))
    return tmp

答案 3 :(得分:0)

您的递归函数可以同时简化和改进。有关详细信息,请参阅以下内容:

#! /usr/bin/env python3


def main():
    array = [6, 3, 7, 5, 5, 2, [3, 2], 1]
    print(sum_min_max(array))


def sum_min_max(array):
    return (lambda a, b: a + b)(*get_min_max(array))


def get_min_max(array, minimum=+float('inf'), maximum=-float('inf')):
    if array:
        head, *tail = array
        if isinstance(head, (list, tuple)):
            minimum, maximum = get_min_max(head, minimum, maximum)
        else:
            if head < minimum:
                minimum = head
            if head > maximum:
                maximum = head
        minimum, maximum = get_min_max(tail, minimum, maximum)
    return minimum, maximum


if __name__ == '__main__':
    main()