查找最接近的元素值(最小值和最大值)以及差异百分比



这是我的示例列表

def closest(lst, K):
return lst[min(range(len(lst)), key = lambda i: abs(lst[i]-K))]
lst = [['0', '2.17'], ['1', '2.11'], ['2', '2.05'], ['3', '2.0'], ['4', '1.86'], ['5', '1.81'], ['6', '1.68'], ['7', '1.22'], ['8', '1.13'], ['9', '1.08'], ['10', '1.02'], ['11', '0.96'], ['12', '0.865'], ['13', '0.805'], ['14', '0.75'], ['15', '0.69'], ['16', '0.6'], ['17', '0.29'], ['18', '0.235'], ['19', '0.185']]
K = 0.545
print(closest(lst, K))

我的期望输出是

max= 0.6
min = 0.29

另外,我想计算min &马克斯。

0.545 ~ 0.6  = 9.60699%
0.29 ~ 0.545 = 61.0778%

你在找这个:

mylist = [['0', '2.17'], ['1', '2.11'], ['2', '2.05'], ['3', '2.0'], ['4', '1.86'], ['5', '1.81'], ['6', '1.68'], ['7', '1.22'], ['8', '1.13'], ['9', '1.08'], ['10', '1.02'], ['11', '0.96'], ['12', '0.865'], ['13', '0.805'], ['14', '0.75'], ['15', '0.69'], ['16', '0.6'], ['17', '0.29'], ['18', '0.235'], ['19', '0.185']]
k = 0.545
limit = 100
m = min(mylist, key = lambda x: float(x[1]) - k if float(x[1]) >= k else limit)
n = min(mylist, key = lambda x: k - float(x[1]) if float(x[1]) <= k else limit)
print (m[1], n[1])
#my percentage calculate
print(float(m[1]) * 100 / k - 100)
print(100 - float(n[1]) * 100 / k)

limit = 100作为哨兵,这里我把最大的值

输出:

0.6 0.29
10.091743119266042
46.78899082568808

我还是不明白你的百分比计算方法

下面是一个简单的函数,用于获取最接近的两个值(第一行需要Python 3.8或更高版本,但也可以针对旧版本进行调整)(如果两边都没有值,它将显示None):

def nearest(lst, k):
(lst := [float(value) for index, value in lst]).append(k)  # get only the values and append k
lst.sort()  # sort the list
nearest_before = lst[nbi] if (nbi := lst.index(k) - 1) >= 0 else None  # get the value if the index is in list
nearest_after = lst[nai] if (nai := lst.index(k) + 1) < len(lst) else None  # get the value if the index is in list
return {'min': nearest_before, 'max': nearest_after}

sample_lst = [['0', '2.17'], ['1', '2.11'], ['2', '2.05'], ['3', '2.0'], ['4', '1.86'], ['5', '1.81'], ['6', '1.68'], ['7', '1.22'], ['8', '1.13'], ['9', '1.08'], ['10', '1.02'], ['11', '0.96'], ['12', '0.865'], ['13', '0.805'], ['14', '0.75'], ['15', '0.69'], ['16', '0.6'], ['17', '0.29'], ['18', '0.235'], ['19', '0.185']]
print(nearest(sample_lst, 0.545))

输出:

{'min': 0.29, 'max': 0.6}

(我返回了一个字典,以保持清晰的值,但你可以改变为任何你需要的)

EDIT:使该函数更像Python 3.8+(同样,它可以针对旧版本进行调整)

唯一的问题是你想如何计算百分比

你可以这样做来找到最接近K的两个数字,其中一个更大,一个更小。取离K距离最大的数并使用一次,取离K距离最小的数大于小于的数比k .

def closest(lst, K):
max_dist = float(max(lst, key = lambda x: abs(float(x[1])-K))[1])
bigger = min(lst, key = lambda x: abs(float(x[1])-K) if float(x[1]) >= K else max_dist)
smaller = min(lst, key = lambda x: abs(float(x[1]) - K) if float(x[1]) < K else max_dist)
return [float(bigger[1]), float(smaller[1])]
lst = [['0', '2.17'], ['1', '2.11'], ['2', '2.05'], ['3', '2.0'], ['4', '1.86'], ['5', '1.81'], ['6', '1.68'], ['7', '1.22'], ['8', '1.13'], ['9', '1.08'], ['10', '1.02'], ['11', '0.96'], ['12', '0.865'], ['13', '0.805'], ['14', '0.75'], ['15', '0.69'], ['16', '0.6'], ['17', '0.29'], ['18', '0.235'], ['19', '0.185']]
K = 0.545
print(closest(lst, K))

输出:

[0.6, 0.29]

下面是一个例子

result_list = list()
K = 0.545
lst = [['0', '2.17'], ['1', '2.11'], ['2', '2.05'], ['3', '2.0'], ['4', '1.86'], ['5', '1.81'], ['6', '1.68'], ['7', '1.22'], ['8', '1.13'], ['9', '1.08'], ['10', '1.02'], ['11', '0.96'], ['12', '0.865'], ['13', '0.805'], ['14', '0.75'], ['15', '0.69'], ['16', '0.6'], ['17', '0.29'], ['18', '0.235'], ['19', '0.185']]
# Check for all number
for data in lst:
result_list.append(float(data[1]))
# Finding min, max
max_dist = float(max(result_list, key = lambda x: abs(x-K)))
smaller  = min(result_list, key=lambda x:abs(x-K)if x <= K else max_dist)
bigger = min(result_list, key=lambda x:abs(x-K) if x >= K else max_dist)
# Finding percentage
per = smaller/bigger*100
print(smaller, bigger, per)

Result:0.29 0.6 48.33

最新更新