我在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
我无法理解这里的标志要求,尽管它会产生正确的结果。
答案 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
<强>注:强>
当i
为list
时,您可以将其重新分配给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的位置),那么您将再次发生问题。