pythonlistpython-3.xnested-lists

How to find the second lowest lists into a nested list by their second value?


Here is given a nested list:

nl = [['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

Now I have to find the second lowest lists into the nested list by their second value. And append the second lowest lists into another list.

So the output should be:

['Harsh', 20], ['Beria', 20]

I wrote the following code but it doesn't work:

nl = [['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

result=[]

temp=max(nl, key=lambda x: x[1])

largest, larger = temp[1], temp[1]
for num in nl:
    if num[1] < largest:
        largest, larger = num[1], largest
    elif num[1] < larger:
        larger = num[1]
        result.append(larger)
print(result)

Solution

  • Get the min of the total elements, filter using that valid then get min of remaining and keep elements equal to min of remaining:

    from operator import itemgetter
    # min of all elements
    mn = min(nl, key=itemgetter(1))[1]
    
    # remove elements equal to min
    filtered = [x for x in nl if x[1] != mn]
    
    # get min of remaining
    mn_fil = min(filtered,key=itemgetter(1))[1]
    
    # filter remaining
    out = [x for x in filtered if x[1] == mn_fil]
    print(out)
    
    [['Harsh', 20], ['Beria', 20]]
    

    Works for both your cases:

    In [19]: nl = [['Prashant', 32], ['Pallavi', 36], ['Dheeraj', 39], ['Shivam', 40]]    
    In [20]: from operator import itemgetter    
    In [21]: mn = min(nl, key=itemgetter(1))[1]    
    In [22]: filtered = [x for x in nl if x[1] != mn]    
    In [23]: mn_fil = min(filtered,key=itemgetter(1))[1]    
    In [24]: out = [x for x in filtered if x[1] == mn_fil]    
    In [25]: out
    Out[25]: [['Dheeraj', 36]]
    

    Using a single for loop we remove all elements from the temp list if we find a lower element, if we find and equally lower one we append it:

    mn = min(nl, key=itemgetter(1))[1]
    temp = []
    best = float("inf")
    for ele in nl:
        if mn < ele[1] < best:
            best = ele[1]
            temp = []
            out.append(ele)
        elif ele[1] == best:
            temp.append(ele)
    print(temp)