我有一个看起来像这样的数组:
[[320, 80], [300, 70], [300, 80], [270, 75], [260, 70], [280, 70]]
这只是一个片段,实际数组是338大。
我试图根据一些输入找到数组中的下一个逻辑元素。所以例如我输入两个数字,即。 315, 80
如果你想找到更大的条目,那么下一个逻辑是320, 80
。
我不想将逻辑关联到最接近,因为它取决于您是否需要更大或更小的元素。所以我认为逻辑上我的意思是“最接近所需的方向”
作为附加要求,第二个数字应尽量保持与输入值尽可能接近,或者第一个数字应尽量保持与原始数字尽可能接近。
我遇到275, 70
等案件时遇到问题,我想找到下一个最小的案例。该 应为260, 70
,但我的实施仍在继续挑选280, 70
我当前的实现增加了两个数字之间的差异,并寻找可能的最小差异。我不确定如何强制执行方向。
Python示例(虽然我真的在寻找与语言无关的解决方案)
elements = [ [320, 80],
[300, 70],
[300, 80],
[270, 75],
[260, 70],
[280, 70]
]
target = [275, 70]
bestMatch = []
bestDifference = 0
for e in elements:
currentDifference = abs((target[0] - e[0]) - (target[1] - e[1]))
if not bestMatch or currentDifference < bestDifference:
bestMatch = e
bestDifference = currentDifference
print bestMatch
答案 0 :(得分:1)
根据您的描述和示例输入,我已经解释了,您应该采用两个差异的最小值,而不是它们的差异。然后你将选择两个数字中任何一个变化最小的元素。
要朝正确的方向前进,您只需检查您当前所在的元素是大于还是小于目标
这样做你会得到以下结果:
elements = [ [320, 80],
[300, 70],
[300, 80],
[270, 75],
[260, 70],
[280, 70]
]
def nextLogicalElement(target, bigger=True):
bestScore = 0
bestMatch = []
for e in elements:
score = min(abs(target[0] - e[0]), abs(target[1] - e[1]))
if bigger and target[0] > e[0] or not bigger and target[0] < e[0]:
continue
if not bestMatch or score < bestScore:
bestMatch = e
bestScore = score
return bestMatch
输出:
>>> print nextLogicalElement([315, 80], bigger=True)
[320, 80]
>>> print nextLogicalElement([275, 70], bigger=False)
[260, 70]