简体   繁体   中英

return the first element with a difference from two lists of lists and stop to compare

I work on a project on python and I need to return the first delta (difference) beetween two lists of lists. And each position in the inside list refer to a name.

I succed to return the first delta for each parameter but I would like to stop at the first sublist with a delta.

My actual code is:

l_name = ["TIME", "ALPHA", "BETA"]         # the list of names
liste1 = [[1, 2, 3.0], [2,5.045,6.003], [3, 8.03, 9], [4, 10.5, 5.5]]     # values of all name in one sublist by step time
liste2 = [[1, 2, 3.0], [2,5.045,6.005], [3, 8.0029, 9], [4, 10.5, 5.5555]]
abs_tol = 0.00001                # tolerence to found a delta

def search_var_delta():
    for i in range(len(l_name)):
        for k in range(len(liste1)):
            a = liste1[k][i]
            b = liste2[k][i]
            diff = abs(a-b)
            if diff >= abs_tol :
                print("the delta : {}".format(diff),
                      "the index : {}".format(k+1),
                      "the parameter : {}".format(l_par[i]))
                break

search_var_delta()

I use break to stop to compare the sublist but it continu to compare the next sublist.

Output:

('the delta : 0.0271', 'the index : 3', 'the parameter : ALPHA')
('the delta : 0.002', 'the index : 2', 'the parameter : BETA')

But I would like only:

('the delta : 0.002', 'the index : 2', 'the parameter : BETA')

because it's the first index with a delta

if I add return l_par[i] it will print the ALPHA one but as we seen it's in index 3 so not in the first sublist with the delta.

Usually it is done with a flag around inner loop but in Python you could use for... else :

def search_var_delta():
    for i in range(len(l_name)):
        for k in range(len(liste1)):
            # ...
            if diff >= abs_tol :
                # ...
                break
        else:
            continue
        break

The trick is the code inside else statement executes when the inner for loop terminates but not when it is terminated by break statement.

You could do it like this:

l_name = ["TIME", "ALPHA", "BETA"]
liste1 = [[1, 2, 3.0], [2,5.045,6.003], [3, 8.03, 9], [4, 10.5, 5.5]]
liste2 = [[1, 2, 3.0], [2,5.045,6.005], [3, 8.0029, 9], [4, 10.5, 5.5555]]
tolerance = 0.00001
def process():
    for i, v in enumerate(zip(liste1, liste2), 1):
        for j in range(len(v[0])):
            if (delta := abs(v[0][j]-v[1][j])) > tolerance:
                print(f'Delta = {delta:.3f}, index = {i}, parameter = {l_name[j]}')
                return
process()

[Note: You'll need Python 3.8+]

Note: sorry for the mistake l_par is l_name. I forgot to change the name.

Ok the answer was simple sorry,

It only need to reverse the for loop and use return:

def search_var_delta():
    for k in range(len(liste1)):
        for i in range(len(l_name)):
            a = liste1[k][i]
            b = liste2[k][i]
            diff = abs(a-b)
            if diff >= abs_tol :
                print("the delta : {}".format(diff),
                      "the index : {}".format(liste1[k][0]),
                      "the parameter : {}".format(l_name[i]))
                return [diff, liste1[k][0], l_name[i]]

search_var_delta()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM