通过比较具有不同成员数量的不同列表来赋值

Assign value by comparison of different lists with different numbers of member

我完全是编程语言的初学者,包括 python,这个问题对我来说有点困难。 如果你们能帮助我,我将不胜感激。

所以我有这两个列表:

S = [[D, 0.67, 0.05], [A, 0.68, 0.06], [C, 2.00, 0.13], [B, 0.68, 0.39], [E, 1.28, 0.97], [F, 0.72, 1.05], [I, 0.58, 1.05], [G, 1.25, 2.03], [H, 1.10, 3.59], [J, 0.98, 4.14]]
R = [[D, 0.67, 0.05], [A, 0.68, 0.06], [C, 2.00, 0.13]]

两个列表中的每个列表都包含 [point name, x value, y value]

因此,我必须通过将列表 S 中列表的 y 值与列表 R 中最接近和较小的 y 值进行比较,为 S 列表中的每个点分配分数以引用 R 列表。 分数将是:

(1/y value of list S) over (1/closest and smaller y value of list R)

示例:S 列表中的点 [B, 0.68, 0.39] 最接近 R 列表中的点 [C, 2.00, 0.13],因此得分将为 (1/0.39)/(1/0.13)

我需要这样的结果:

S_score = [[D,1],[A,1],[C,1],[B,0.33],[E,0.13],[F,0.12],[I,0.12],[G,0.06],[H,0.04],[J,0.03]]

这是我到目前为止所做的,但我不知道如何使 S_score 列表包含点名称。除了这段代码似乎效率不高,因为如果列表 R 中有更多成员作为参考,我需要尽可能多地设置条件

S_score = []
for i in xrange(len(S)):
    if S[i][2] >= R[0][2] and S[i][2] <= R[1][2]:
        value = (1/S[i][2]) / (1/R[0][2])
        score.append(value)
    else:
        if S[i][2] >= R[1][2] and S[i][2] <= R[2][2]:
            value = (1 / S[i][2]) / (1 / R[1][2])
            score.append(value)
        if S[i][2] >= R[2][2]:
            value = (1 / S[i][2]) / (1 / R[2][2])
            score.append(value)

print "Score: ", S_score

提前致谢

这个有效:

def maximum(arr):
    x = arr[0]
    for x1 in arr:
        x = x1 if x1[2] > x[2] else x
    return x

def foo(x, arr):
    x1 = maximum(filter(lambda x2: x2[2] <= x[2], arr))
    return (1/x[2])/(1/x1[2])

result = [[x[0], foo(x, R)] for x in S]

这里的想法是,foo 函数只会将那些 y 小于或等于当前 y 的 R 值发送给 maximum 函数,并且那个 return 具有最大 y 的值.

之后就是你提供的计算了。

带有结果的代码是一个简单的列表理解。