如何使用另一个列表拆分列表

时间:2019-07-19 20:01:16

标签: python

我有两个列表。两者都是数字排序列表。说:

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_valuestransformed_remainder

  

如何从变量transformed_valuestransformed_remainder高效地计算AB?也许根本不需要计算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会更好。)

2 个答案:

答案 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")