python - 如何一次比较多个列表的数值接近度?

标签 python list epsilon list-comparison floating-point-comparison

假设我有 4 个列表:

A = [1.1, 1.4, 2.1, 2.4]
B = [1.3, 6.5, -1.0, 2.3]
C = [0.5, -1.0, -1.1, 2.0]
D = [1.5, 6.3, 2.2, 3.0]

如何 1)比较列表,例如 A、B B、C C、D A、C 等,2)如果元素为 +/-0.2,则返回 true?

Example output: (Or any other way to represent the data)
A,B [true, false, false, true]
B,C [false, false, true, false]

我的想法是在列表中附加一个 for 循环来迭代所有列表。

A.append(B)
A.append(C)
.
.

但是如果我这样做,我就会陷入困境

for x in A:
    for y in A[x]:
        if A[x][y] - A[x+1][y] <= 0.2
            if A[x+1][y] - A[x][y] <= 0.2

显然这是行不通的。 有没有办法在不重复的情况下迭代列表并同时进行比较?

提前致谢

最佳答案

更新:

好的,现在我想我明白你问的两个问题:

from itertools import combinations

A = [1.1, 1.4, 2.1, 2.4]
B = [1.3, 6.5, -1.0, 2.3]
C = [0.5, -1.0, -1.1, 2.0]
D = [1.5, 6.3, 2.2, 3.0]
lists = {'A': A, 'B': B, 'C': C, 'D': D}
tol = 0.2

def compare_lists(a, b, tol):
    return [abs(elem1-elem2) <= tol for elem1, elem2 in zip(a, b)]  # Might want '<' instead

for name1, name2 in combinations(lists.keys(), 2):
    a, b = lists[name1], lists[name2]
    print('{}, {} {}'.format(name1, name2, compare_lists(a, b, tol)))

输出:

A, B [True, False, False, True]
A, C [False, False, False, False]
A, D [False, False, True, False]
B, C [False, False, True, False]
B, D [True, False, False, False]
C, D [False, False, False, False]

更新2:

要回答您的后续问题,如果列表实际上是列表列表的成员,您可以类似地执行以下操作:

# An alternative for when the lists are nested inside another list

from itertools import combinations

lists = [
    [1.1, 1.4, 2.1, 2.4],
    [1.3, 6.5, -1.0, 2.3],
    [0.5, -1.0, -1.1, 2.0],
    [1.5, 6.3, 2.2, 3.0]
]
tol = 0.2

def compare_lists(a, b, tol):  # unchanged
    return [abs(elem1-elem2) <= tol for elem1, elem2 in zip(a, b)]  # Might want '<' instead

for i, j in combinations(range(len(lists)), 2):  # all combinations of pairs of indices
    a, b = lists[i], lists[j]
    print('{}[{}], [{}] {}'.format('lists', i, j, compare_lists(a, b, tol)))

输出:

lists[0], [1] [True, False, False, True]
lists[0], [2] [False, False, False, False]
lists[0], [3] [False, False, True, False]
lists[1], [2] [False, False, True, False]
lists[1], [3] [True, False, False, False]
lists[2], [3] [False, False, False, False]

关于python - 如何一次比较多个列表的数值接近度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690324/

相关文章:

python - 如何在 python 中创建 turtle 列表?

python - 根据 pandas 中的列值导出到 csv

c# - Math.Abs​​(x) < double.Epsilon 是否等同于 Math.Abs​​(x) == 0d?

c# - 智能感知中没有 Where 的 List<T>

python - 更改列表的最后 1000 个值的最小值和最大值

python - 如何有效地根据 python 中的键值对字典列表进行分类?

python - ical RRULE 语句中 UNTIL 的时区问题

Python 类型错误 : '<' not supported between instances of 'int' and 'list'

python - 从列表中随机选择 50 个项目