0

我在 python 上的一个项目上工作,我需要返回两个列表列表之间的第一个增量(差异)。并且内部列表中的每个位置都引用一个名称。

我成功地为每个参数返回了第一个增量,但我想在第一个带有增量的子列表处停止。

我的实际代码是:

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

我使用 break 来停止比较子列表,但它会继续比较下一个子列表。

输出 :

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

但我只想:

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

因为它是第一个有 delta 的索引

如果我添加 return l_par[i]它将打印 ALPHA ,但正如我们所见,它在索引 3 中,所以不在第一个带有 delta 的子列表中。

4

3 回答 3

1

通常它是通过内部循环周围的标志来完成的,但在 Python 中,您可以使用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

诀窍是else语句内部的代码在内部循环终止时执行,for但在它被break语句终止时不执行。

于 2021-10-08T08:14:27.167 回答
0

注意:对不起,错误 l_par 是 l_name。我忘记改名字了。

好的答案很简单抱歉,

它只需要反转 for 循环并使用 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()
于 2021-10-08T08:57:57.477 回答
0

你可以这样做:

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

[注意:您需要 Python 3.8+]

于 2021-10-08T08:29:51.183 回答