我试图在python中的排序列表中同时获得最接近的值和它的索引。在MATLAB中,这可以通过以下方式实现:
[closest_val,index] = min(abs(array - target))
我想知道是否有类似的方法可以在python中实现。我见过这样或那样做的帖子,但我还没有看到两者一起做。Link到查找列表帖子中最接近的值。
y53ybaqx1#
这是一个选项:
lst = [ 13.09409, 12.18347, 11.33447, 10.32184, 9.544922, 8.813385, ] target = 11.5 res = min(enumerate(lst), key=lambda x: abs(target - x[1])) # (2, 11.33447)
enumerate以index, value对的形式迭代你的列表。min方法的key告诉它只考虑value。注意python从0开始索引;据我所知,matlab在1上。如果您想要相同行为:
enumerate
index, value
min
key
value
0
1
res = min(enumerate(lst, start=1), key=lambda x: abs(target - x[1])) # (3, 11.33447)
如果列表很大,我强烈建议您使用bisect,如this answer中所建议的那样。
bisect
3ks5zfa02#
bisect没有在链接的问题中使用,因为列表没有排序。在这里,我们没有相同的问题,我们可以使用bisect,因为它提供了速度:
import bisect def find_closest_index(a, x): i = bisect.bisect_left(a, x) if i >= len(a): i = len(a) - 1 elif i and a[i] - x > x - a[i - 1]: i = i - 1 return (i, a[i]) find_closest_index([1, 2, 3, 7, 10, 11], 0) # => 0, 1 find_closest_index([1, 2, 3, 7, 10, 11], 7) # => 3, 7 find_closest_index([1, 2, 3, 7, 10, 11], 8) # => 3, 7 find_closest_index([1, 2, 3, 7, 10, 11], 9) # => 4, 10 find_closest_index([1, 2, 3, 7, 10, 11], 12) # => 5, 11
EDIT:如果是降序数组:
def bisect_left_rev(a, x, lo=0, hi=None): if lo < 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: mid = (lo+hi)//2 if a[mid] > x: lo = mid+1 else: hi = mid return lo def find_closest_index_rev(a, x): i = bisect_left_rev(a, x) if i >= len(a): i = len(a) - 1 elif i and a[i] - x < x - a[i - 1]: i = i - 1 return (i, a[i]) find_closest_index_rev([11, 10, 7, 3, 2, 1], 0) # => 5, 1 find_closest_index_rev([11, 10, 7, 3, 2, 1], 7) # => 2, 7 find_closest_index_rev([11, 10, 7, 3, 2, 1], 8) # => 2, 7 find_closest_index_rev([11, 10, 7, 3, 2, 1], 9) # => 1, 10 find_closest_index_rev([11, 10, 7, 3, 2, 1], 12) # => 0, 11
2条答案
按热度按时间y53ybaqx1#
这是一个选项:
enumerate
以index, value
对的形式迭代你的列表。min
方法的key
告诉它只考虑value
。注意python从
0
开始索引;据我所知,matlab在1
上。如果您想要相同行为:如果列表很大,我强烈建议您使用
bisect
,如this answer中所建议的那样。3ks5zfa02#
bisect
没有在链接的问题中使用,因为列表没有排序。在这里,我们没有相同的问题,我们可以使用bisect
,因为它提供了速度:EDIT:如果是降序数组: