查找列表中与另一个列表中元素近似相等的元素的索引



我有两个浮点数列表:

list_1 = [1.03, 3.56, 4.91, 2.85, 5.55, 1.12, 1.73, 1.33, 2.56, 2.58, 3.53]
list_2 = [1.05, 1.55, 2.05, 2.55, 3, 3.55, 4]

目标是比较两个列表,并返回第一个列表(list_1)中元素的索引,如果它们基于特定的阈值近似相等。

def compare_lists(list1, list2, threshold=0.02):
output_list = []
for i in range(len(list1)):
for j in range(len(list2)):
print(abs(list1[i] - list2[j]))
if abs(list1[i] - list2[j]) <= threshold:
output_list.append(i)
return output_list

这只是返回[1, 8],我认为这是错误的。输出列表中应该包含一些索引,如0和最后一个。

我认为问题出在浮点数的减法上。我检查了1.03和1.05之间的差异,它返回0.02000000000000018

如何解决这个问题?或者我可以把它们四舍五入,但这不是一个好的选择,因为列表可以包含不同的小数点。它不仅仅局限于2个点,以及阈值。

由于舍入错误,您可能需要更多填充:

list_1 = [1.03, 3.56, 4.91, 2.85, 5.55, 1.12, 1.73, 1.33, 2.56, 2.58, 3.53]
list_2 = [1.05, 1.55, 2.05, 2.55, 3, 3.55, 4]
output = [i for i, x in enumerate(list_1) for y in list_2 if abs(x - y) <= 0.02 + 1e-8]
print(output) # [0, 1, 8, 10]

Python有decimal模块https://docs.python.org/3/library/decimal.html "用于快速正确四舍五入的十进制浮点运算"。

from decimal import Decimal
list_1 = [1.03, 3.56, 4.91, 2.85, 5.55, 1.12, 1.73, 1.33, 2.56, 2.58, 3.53]
list_2 = [1.05, 1.55, 2.05, 2.55, 3, 3.55, 4]
def compare_lists(list1, list2, threshold=0.02):
threshold = Decimal(str(threshold))
list2 = [Decimal(str(y)) for y in list2]
output_list = []
for i, x in enumerate(list1):
x = Decimal(str(x))
if any(abs(x-y) <= threshold for y in list2):
output_list.append(i)
return output_list
print(compare_lists(list_1, list_2))  # prints [0, 1, 8, 10]

相关内容

  • 没有找到相关文章

最新更新