我有两个列表。两者都是数字排序列表。说:
A = [1.1, 5.2, 12.3, 12.6]
B = [2.3, 2.7, 5.2, 11.1, 12.1, 15.6, 16.6]
对于A中的每个数字,我发现B中最接近的值。例如
1.1 -> 2.3
5.2 -> 5.2
12.3 -> 12.1
12.6 -> 12.1
我现在想使用此映射将B拆分为列表列表。 A中某个值映射到的每个点都作为间隔的结尾。所以我得到
listoflists = [[2.3], [2.7, 5.2], [11.1, 12.1]]
,其余为:
remainder = [15.6, 16.6]
现在,我需要将listoflists中的值转换为与listoflists中上一个列表的末尾值的距离。我们假设在0处有一个隐含值。因此:
transformed_values = [[2.3], [0.4, 2.9], [5.9, 6.9]]
将余数类似地转换为:
transformed_remainder = [3.5, 4.5]
我一直努力写出明智而正确的代码来输出transformed_values
和transformed_remainder
。
如何从变量
transformed_values
和transformed_remainder
高效地计算A
和B
?也许根本不需要计算listoflists
就可以直接完成?
我确实有找到最接近值的代码:
def find_nearest(array, value):
idx = np.searchsorted(array, value, transformed_remainderside="left")
if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
return array[idx-1]
else:
return array[idx]
(我将需要做很多事情,因此使用numpy可能会产生过多开销,而使用bisect会更好。)
答案 0 :(得分:1)
我认为您不需要listoflists
方面的帮助。这就是您进行转换的方式。
transformed_values = (
listoflists[0]
+ [[a - prior[-1], b - prior[-1]]
for (a, b), prior in zip(listoflists[1:], listoflists[:-1])]
)
transformed_remainder = [r - listoflists[-1][-1] for r in B[(len(A) + 1):]]
答案 1 :(得分:0)
您可以使用以下代码:
a = [1.1, 5.2, 12.3, 12.6]
b = [2.3, 2.7, 5.2, 11.1, 12.1, 15.6, 16.6]
for i in a:
nearest = None
nearestNum = None
for x in b:
if nearest == None:
nearest = abs(i - x)
nearestNum = x
if abs(i - x) < nearest:
nearestNum = x
nearest = abs(i - x)
if nearestNum:
print(i, "->", nearestNum)
else:
print(i, "-> Not found")
#or
for i in a:
nearest = []
nearestNum = None
for x in b:
nearest.append(abs(i - x))
nearest.sort()
if i + nearest[0] in b:
nearestNum = i + nearest[0]
elif i - nearest[0] in b:
nearestNum = i - nearest[0]
if nearestNum:
print(i, "->", nearestNum)
else:
print(i, "-> Not found")