Python获得第二个最小元素嵌套列表递归

时间:2015-06-28 22:17:19

标签: python list recursion nested

我想使用递归而没有内置函数从嵌套列表中返回第二个最小元素。即。

>>>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

有没有办法让这项工作或我应该寻找不同的方法?

2 个答案:

答案 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