def min_max(L):
if len(L) == 1:
res = [L[0], L[0]]
else:
res = min_max(L[1:])
if (L[0] < res[0]):
res[0] = L[0]
if (L[0] > res[1]):
res[1] = L[0]
return res
这是我的常规列表代码。如果只有一个元素,那么该元素都是最小值和最大值。否则,我们会在其前面的列表中找到元素的最小值和最大值,然后我们进行比较,然后交换更大或更小。
我应该为嵌套列表执行此操作。我尝试做的是在if len(L) == 1
案例之前添加这行代码。
if isinstance(L[0],list):
res = min_max(L[0])
elif len(L) == 1:
res = [L[0], L[0]]
这部分有效,但在min_max([[3,2],4])
等示例中,如果不考虑4,则返回[2,3]
。如何解决此问题?
答案 0 :(得分:2)
以下适用于我:
def min_max(L):
length = len(L)
if length == 1:
if isinstance(L[0],list): // sole element is a list, return its min & max
return min_max(L[0])
else:
return [L[0], L[0]] // otherwise it is both the min & max
else:
mid = length // 2
result = min_max(L[:mid]) // find min and max of first half of list
result2 = min_max(L[mid:]) // ditto for second half of list
// now determine which of the two sets are the min and max of current list
if (result2[0] < result[0]):
result[0] = result2[0]
if (result2[1] > result[1]):
result[1] = result2[1]
return result
请注意,这会将列表每次减少一半,而不是一次减少一个元素。您仍然最终检查每个元素,但堆栈上的调用数量与列表长度的日志成比例增长,因此该版本几乎可用于您可以创建的任何列表列表,其中您的列表仅适用于列表少于1000个元素。
如果您担心可能的空列表或子列表:
def min_max(L):
length = len(L)
if length > 1:
mid = length // 2
result = min_max(L[:mid])
result2 = min_max(L[mid:])
if (result2[0] < result[0]):
result[0] = result2[0]
if (result2[1] > result[1]):
result[1] = result2[1]
return result
elif length == 1:
if isinstance(L[0],list):
return min_max(L[0])
else:
return [L[0], L[0]]
else:
return [float('inf'), -float('inf')]
答案 1 :(得分:0)
您可以通过传递当前的最小值和时间来简化您的代码。 max作为额外参数。那么你的代码基本上需要处理三种不同的场景:
在实践中,代码看起来像这样:
def min_max(L, minimum=float('inf'), maximum=-float('inf')):
# Base case, return accumulated result
if not L:
return minimum, maximum
if isinstance(L[0], list):
# Element is a list, recurse with it
minimum, maximum = min_max(L[0], minimum, maximum)
else:
# Element is a number, update current min & max
minimum = min(minimum, L[0])
maximum = max(maximum, L[0])
# Process rest of the elements on the list
return min_max(L[1:], minimum, maximum)
print(min_max([[3,2],4]))
输出:
(2, 4)