给定一个浮点数,找到列表中的列表或最接近的数字

时间:2014-04-22 05:48:59

标签: python list

我有一个元组列表,即2-dim元组,其值为x和y。称之为数据。我想取两个浮点数xmin和xmax,并返回该时间间隔内最大y值的索引。 即使xmin和xmax与数据点不完全匹配,它也应该工作。

我理解如何解决问题,除了将xmin和xmax舍入到列表中最接近的值的方法。我不知道我是一个蟒蛇新手。

# Find the index of the point (x, y) with the maximum y value
# on the interval [xmin, xmax]
def find_peak(data, xmin, xmax):

暂时,我可以搜索列表并记录每个x值的最小差异。这是可行的还是有更聪明的方法?

2 个答案:

答案 0 :(得分:1)

给出2维坐标列表。

  1. 根据x坐标对数据进行排序。这应该是自然列表排序。
  2. 使用python bisect模块确定数据点的起始和结束索引
  3. 使用带有密钥min的内置operator.itemgetter(1)来查找x_main和x_max中具有最大y值的元素
  4. 示例实施

    def foo(data, x_min, x_max):
        from bisect import bisect_left, bisect
        from operator import itemgetter
        data = sorted(data)
        x_data = [x for x,y in data]
        index_min = bisect_left(x_data, x_min)
        index_max = bisect(x_data, x_max)
        return max(data[index_min:index_max],key=itemgetter(1))[-1]
    

    运行示例

    >>> data = [(random.randint(1,20),random.randint(1,20)) for _ in range(10)]
    >>> data
    [(9, 9), (11, 11), (7, 7), (16, 11), (15, 19), (8, 18), (16, 3), (18, 7), (17, 13), (3, 11)]
    >>> foo(data,3,7)
    11
    

答案 1 :(得分:1)

max_finder = lambda point: point[1] if x_min <= point[0] <= x_max else float("-inf")
# get data point of target element
max_y = max(data, key=max_finder)

# gets index of target element
max_y_idx = max(enumerate(data), key=lambda x: max_finder(x[1]))[0]
# or alternatively, after finding max_y
max_y_idx = data.index(max_y_idx)

请注意,这应该略微优于排序变体,因为max具有O(n)复杂度,index具有O(n)最坏情况复杂度,与O(n * log(n))相比排序复杂性。

有关详细信息,请参阅maxenumerate文档