需要在列表列表中找到最大值

时间:2018-05-30 13:43:34

标签: python list

我在Peter Wentworth的'如何像计算机科学家一样思考:学习Python 3,第3版'中找到了这个问题。我也在下面添加了他们的解决方案。

我的简单递归函数产生错误的输出

def maximum_in_list(L):
    '''Finds the maximum value from L which is a List_of_List'''
    item=0
    for i in L:
        if type(i)==list:
            item=maximum_in_list(i)
        elif i>item:
            item=i
    return item

print(maximum_in_list([9,18,99,7,4,21,[3,5,[27,57,92],7,76],32,4]))
print(maximum_in_list([2, 9, [1, 13], 8, 6]))
print(maximum_in_list([2, [[100, 7], 90], [1, 13], 8, 6])) #Here the problem occurs
print(maximum_in_list([[[13, 7], 90], 2, [1, 100], 8, 6]))

书籍代码产生正确的一个,但为什么需要一个标志?

def r_max(nxs):
   largest=None
   first_time=True
   for e in nxs:
       if type(e)=type([]):
           val=r_max(e)
       else:
           val=e
       if first_time or val>largest:
           largest=val
           first_time=False
   return largest

我无法理解这里的标志要求,尽管它会产生正确的结果。

4 个答案:

答案 0 :(得分:3)

您的递归方法存在问题。简单的解决方法是:

item = max(item, maximum_in_list(i))

更新的代码如下所示:

def maximum_in_list(L):
    '''Finds the maximum value from L which is a List_of_List'''
    item=0
    for i in L:
        if type(i)==list:
            item=max(item, maximum_in_list(i))
        elif i>item:
            item=i
    return item

print(maximum_in_list([9,18,99,7,4,21,[3,5,[27,57,92],7,76],32,4]))
print(maximum_in_list([2, 9, [1, 13], 8, 6]))
print(maximum_in_list([2, [[100, 7], 90], [1, 13], 8, 6])) #Here the problem occurs
print(maximum_in_list([[[13, 7], 90], 2, [1, 100], 8, 6]))

第一次使用标志来防止将None值与整数进行比较。如果您在没有first_time检查的情况下进行比较,则会导致类型错误。

答案 1 :(得分:2)

这是一个更紧凑的递归解决方案,它使用生成器表达式和内置的let token = 'abcd1234'; let url = `http://domain/arcgis/rest/services/${serviceName}/MapServer/${layer_id}/query?f=json&where=1%3D1&returnGeometry=false&outFields=*&token=${token}`; 函数。它可以正确处理负值,也可以处理非数字数据。但是,如果您传递一个包含无法比较的项目的列表,例如数字和字符串,它将引发max

TypeError

<强>输出

def r_max(lst):
    return max(r_max(u) if isinstance(u, list) else u for u in lst)

# test

data = (
    [9,18,99,7,4,21,[3,5,[27,57,92],7,76],32,4],
    [2, 9, [1, 13], 8, 6],
    [2, [[100, 7], 90], [1, 13], 8, 6],
    [[[13, 7], 90], 2, [1, 100], 8, 6],
    [[[-13, -7], -90], -2, [-1, -100], -8, -6],
    ['abc', 'd', ['ef', 'ghi', ['jkl', 'zzz'], 'xy', 'z']],
)

for lst in data:
    print(lst)
    print(r_max(lst))

答案 2 :(得分:1)

以下是您的功能的简洁解决方法:

def maximum_in_list(L):
    '''Finds the maximum value from L which is a List_of_List'''
    item = -float('inf')
    for i in L:
        if isinstance(i, list):
            i = maximum_in_list(i)  # see remark
        item = max(item, i)
    return item

<强>注:

ilist时,您可以将其重新分配给list递归)的最大值,这样您就不必使用过多的if陈述进一步下降。

print(maximum_in_list([9,18,99,7,4,21,[3,5,[27,57,92],7,76],32,4]))  # ->  99
print(maximum_in_list([2, 9, [1, 13], 8, 6]))                        # ->  13
print(maximum_in_list([2, [[100, 7], 90], [1, 13], 8, 6]))           # -> 100
print(maximum_in_list([[[13, 7], 90], 2, [1, 100], 8, 6]))           # -> 100

答案 3 :(得分:-1)

该标志确保每次都不将项变量重置为0,从而产生有问题的输出。您的代码遇到的问题是,无论何时为子列表调用函数,它都会重置项变量,然后将最大值与0进行比较而不是旧的最大值。

在有问题的输入中,如果更改位置6和100,您将获得正确的输出,因为最后一个子列表已被处理完毕。如果在现在更改为100之后添加另一个子列表(在6的位置),那么您将再次发生问题。