我想使用递归而没有内置函数从嵌套列表中返回第二个最小元素。即。
>>>ss([[[1,3],[2],3]])
2
我知道如何获得这些列表的最大值和最小值,但是我无法跟踪第二个最小值。
到目前为止我所写的内容确实返回了正确的最小值但不适用于第二小的值。
def ss(L):
smallest = L[0]
while type(smallest) == type([]):
smallest = smallest[0]
second_smallest = smallest
for element in L:
if type(element) == type([]):
current = ss(element)
if current > smallest and current < second_smallest:
second_smallest = current
if current < smallest and current < second_smallest:
second_smallest = smallest
smallest = current
else:
if smallest < element and element < second_smallest:
second_smallest = element
if smallest > element and second_smallest > element:
second_smallest = smallest
smallest = element
return second_smallest
有没有办法让这项工作或我应该寻找不同的方法?
答案 0 :(得分:0)
好吧,一旦你为一个平面列表解决了它,你可以编写一个函数来展平列表:
def secondSmallest(l):
def iterflat(l):
for i in l:
if isinstance(i,(list,tuple)):
yield from iterflat(i)
else:
yield i
def min2(l,m1=float('inf'),m2=float('inf')):
if l==[]: return (m1,m2)
if l[0] > m2: return min2(l[1:],m1,m2)
if l[0] > m1: return min2(l[1:],m1,l[0])
if l[0] < m1: return min2(l[1:],l[0],m1)
return min2(list(iterflat(l)))[1]
测试:
>>> secondSmallest([1,6,3,4,9,4,2,5,3,6,2])
2
>>> secondSmallest([1,6,3,4,9,[4,[9,8,-2,-3]],2,5,3,6,2])
-2
答案 1 :(得分:0)
这是一个快速解决方案,涉及展平嵌套列表(或元组),然后找到第二个最低值。请注意,此方法将跳过最低值的多个实例。输入[1,1,1,2,3]将返回2.列表展平方法是from here。
def flatten(container):
for i in container:
if isinstance(i, list) or isinstance(i, tuple):
for j in flatten(i):
yield j
else:
yield i
def ss(container):
tmp = list(set(flatten(container)))
tmp.sort
return tmp[1]
ss([1, 2, [3, 4, [5],[1]], [6, [[[7, 3]]]]])
>> 2