假设我们有两个等长的数组:
arr1 = (21, 2, 3, 5, 13)
arr2 = (10, 4.5, 9, 12, 20)
arr1
中的哪个变量等于/最接近 arr2
中的变量?
查看这两个列表,我们可以很容易地得出最接近的数字是 4.5 和 5。我已经尝试实现一个函数,它在给定两个列表的情况下返回两个最接近的值,并且它对上面的示例有点工作,但它几乎不是一个解决方案,因为它不是最佳的。当我们像这样稍微更改数组时,您可以轻松地检查函数是否失败:
arr1 = (21, 2, 3, 5, 13)
arr2 = (10, 4.5, 9, 12, 18)
函数返回的值是 13 和 18
函数如下:
def get_nearest(arr1, arr2):
lr = [[0, 0, 0]]
for x1 in arr1:
for x2 in arr2:
r = (x1 / x2 % (x1 + x2))
print x1, x2, r
if r <= 1 and r >= lr[0][2]:
lr.pop()
lr.append([x1, x2, r])
return lr
你能想出一个更好的吗?
最佳答案
速度是个问题吗?你在乎领带吗?如果不是,那么简单的事情怎么样
from itertools import product
sorted(product(arr1, arr2), key=lambda t: abs(t[0]-t[1]))[0]
两者皆有
arr1 = (21, 2, 3, 5, 13)
arr2 = (10, 4.5, 9, 12, 20)
和
arr1 = (21, 2, 3, 5, 13)
arr2 = (10, 4.5, 9, 12, 18)
这产生
(5, 4.5)
解释:
product(arr1, arr2) = [(a1, a2) for (a1, a2) in product(arr1, arr2)]
生成所有 N**2
对数字的列表:
[(21, 10), (21, 4.5), ..., (13, 12), (13, 20)]
然后我们使用sorted
按绝对差值(|a1 - a2|
) 对它们进行排序。通过将 sorted
传递给 key
关键字,我们告诉 sorted
使用排序标准 lambda t: abs(t[0] - t [1])
。绝对差值最小的对放在排序数组的第一个索引中,因此我们可以通过在末尾添加 [0]
来获取它。
编辑:
正如 Piotr 在评论中所建议的,您可以将 key=func
提供给 min
和 max
,这会大大加快速度。试试看:
from itertools import product
min(product(arr1, arr2), key=lambda t: abs(t[0]-t[1]))[0]
关于Python:如何在两个单独的数组之间找到两个相等/最接近的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27239786/