我写了这个并且它的工作正常,但是当我有一个空列表时
在给定的列表(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
答案 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)
但我并不喜欢这个解决方案 - 但它可能会激励你想出更好的东西。
与您的相比,我想强调一下这个解决方案的两件事:
type(largest) == type([])
等)并不是惯用的Python。它有效,但Python的一个关键点是它提升duck typing / EAFP,这意味着你应该更关心一个对象可以做什么(而不是它是什么类型)并且你应该尝试一些东西并恢复,而不是弄清楚你是否可以做到。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)
答案 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