我试图创建一个从嵌套列表返回最大值的函数?

时间:2015-02-04 02:25:34

标签: python recursion

我写了这个并且它的工作正常,但是当我有一个空列表时 在给定的列表(given_list=[[],1,2,3])中,它表示索引超出范围。有什么帮助吗?

def r_max (given_list):
    largest = given_list[0]
    while type(largest) == type([]):
        largest = largest[0]

    for element in given_list:
        if type(element) == type([]):
            max_of_elem = r_max(element)
            if largest < max_of_elem:
                largest = max_of_elem
        else:                           # element is not a list
            if largest < element:
                largest = element

    return largest

6 个答案:

答案 0 :(得分:1)

您假设given_list至少有1个元素不正确。 为避免索引超出范围,您可以添加

if (len(given_list) == 0)
  return None

到你的功能的开头。

答案 1 :(得分:1)

该错误表示您的索引超出范围,这是示例的第一个元素的情况。解决方案不是迭代长度为零的列表:

def r_max (given_list):
    largest = given_list[0]
    while type(largest) == type([]):
        largest = largest[0]

    for element in given_list:
        if type(element) == type([]):
            # If the list is empty, skip
            if(len(elemnt) == 0)
                next
            max_of_elem = r_max(element)
            if largest < max_of_elem:
                largest = max_of_elem
        else:                           # element is not a list
            if largest < element:
                largest = element

    return larges

在你的时候,你可能想要assert len(given_list)>0或类似的东西。

答案 2 :(得分:0)

如果嵌套是任意深度的,首先需要递归来解开它:

def items(x):
    if isinstance(x, list):
        for it in x:
            for y in items(it): yield y
    else: yield x

现在,max(items(whatever))可以正常使用。

在Python 3的最新版本中,您可以通过更改

来使其更加优雅
        for it in x:
            for y in items(x): yield y

成:

        for it in x: yield from it

答案 3 :(得分:0)

如果您确信那里只有一个级别的嵌套,您可以执行类似

的操作
def r_max(lst):
    new_lst = []
    for i in lst:
        try:
            new_lst.extend(i)
        except TypeError:
            new_lst + [i]
    return max(new_lst)

但我并不喜欢这个解决方案 - 但它可能会激励你想出更好的东西。

与您的相比,我想强调一下这个解决方案的两件事:

  1. 您正在进行的所有类型检查(type(largest) == type([])等)并不是惯用的Python。它有效,但Python的一个关键点是它提升duck typing / EAFP,这意味着你应该更关心一个对象可以做什么(而不是它是什么类型)并且你应该尝试一些东西并恢复,而不是弄清楚你是否可以做到。
  2. Python非常好&#34;找到列表中最大的数字&#34;功能 - max。如果您可以将输入设为非嵌套列表,那么max将为您完成剩下的工作。

答案 4 :(得分:0)

这将在列表中找到包含嵌套列表和忽略字符串实例的最大值。

A = [2, 4, 6, 8, [[11, 585, "tu"], 100, [9, 7]], 5, 3, "ccc", 1]

def M(L):

    # If list is empty, return nothing
    if len(L) == 0:
        return

    # If the list size is one, it could be one element or a list
    if len(L) == 1:

        # If it's a list, get the maximum out of it
        if isinstance(L[0], list):
            return M(L[0])
        # If it's a string, ignore it
        if isinstance(L[0], str):
            return
        # Else return the value
        else:
            return L[0]

    # If the list has more elements, find the maximum
    else:
        return max(M(L[:1]), M(L[1:]))


print A
print M(A)

Padmal's BLOG

答案 5 :(得分:0)

我假设空列表的最大元素是负无穷大。

这个假设将处理[],[1,2,[],5,4,[]]等案例

def find_max(L):

    if len(L) == 0:
        return float("-inf")
    elif len(L) == 1:
        if isinstance(L[0], list):
            return find_max(L[0])
        else:
            return L[0]
    elif len(L) == 2:
        if isinstance(L[0], list):
            firstMax = find_max(L[0])
        else:
            firstMax = L[0]
        if isinstance(L[1], list):
            lastMax = find_max(L[1])
        else:
            lastMax = L[1]
        if firstMax > lastMax:
            return firstMax
        else:
            return lastMax
    else:
        if isinstance(L[0], list):
            firstMax = find_max(L[0])
            lastMax = find_max(L[1:])
            if firstMax > lastMax:
                return firstMax
            else:
                return lastMax
        else:
            lastMax = find_max(L[1:])
            if L[0] > lastMax:
                return L[0]
            else:
                return lastMax