在x

时间:2018-11-08 02:30:15

标签: python python-2.7

我对Python还是很陌生,试图弄清楚如何使用Python 2中所有现有的内置函数来执行此操作。

我在嵌套元组中有一组数据,并希望在指定的x范围内获取对应y的最大值。我的xy是指((x1, y1), (x2, y2), ...)。 例如:

data = ((1,33),(2,24),(3,42),(4,2),(8,12))

我想编写一个代码,以便当我指定x24之间的时间时,我得到y的最大值,即{{1 }}。

4 个答案:

答案 0 :(得分:3)

只需:

def get_max_with_boundaries(data, vmax, vmin):
    try:
        return max([x[1] for x in data if x[0] >= vmin and x[0] <= vmax])
    except ValueError:
        return None

添加filter内置函数后,它变为:

def get_max_with_boundaries(data, vmax, vmin):
    try:
        bound_data = filter(lambda x: x[0] >= vmin and x[0] <= vmax, data)
        return max(bound_data, key=lambda x: x[1])
    except ValueError:
        return None

答案 1 :(得分:0)

max()条件下使用range

data = ((1,33),(2,24),(3,42),(4,2),(8,12))

print(max((y for x, y in data if x in range(2, 5)), default=None))
# 42

您还可以将默认值设置为None,因此,如果在指定范围内没有x的值,则返回None

Python 2 上:

print max(y for x, y in data if x in range(2, 5))
# 42

答案 2 :(得分:0)

直接的答案是先使用filter,然后使用max。像这样

from operator import itemgetter

# straightforward linear search
data = ((1, 33), (2, 24), (3, 42), (4, 2), (8, 12))

filtered = filter(lambda t: 2 <= t[0] <= 4, data)
x, y = max(filtered, key=itemgetter(1))
print(y)

但是,有一种更有效的方法。给定列表是由第一个元组元素排序的,您可以使用二进制搜索来找到范围的开始和结束(假设,但这似乎来自您的示例)。可能只有在您的输入很大时才需要它,否则就不保证额外的复杂性。

from operator import itemgetter
from bisect import bisect_left, bisect_right


class KeyWrapper:
    def __init__(self, iterable, key):
        self.it = iterable
        self.key = key

    def __getitem__(self, i):
        return self.key(self.it[i])

    def __len__(self):
        return len(self.it)


def slicerange(iterable, lo, hi, key=None):

    wrapped = KeyWrapper(iterable, key) if key else iterable

    start = bisect_left(wrapped, x=lo)
    end = bisect_right(wrapped, x=hi, lo=start)

    return iterable[start: end]


myrange = slicerange(data, 2, 4, key=itemgetter(0))
x, y = max(myrange, key=itemgetter(1))
print(y)

我们正在对提供的数据的元素进行二进制搜索,而不是使用其自然顺序,因此我使用了this答案中的KeyWrapper类,以允许通过键函数进行二进制搜索

找到起点和终点,将其切成薄片,然后使用另一个键功能(在索引1处查找元素)找到max

答案 3 :(得分:0)

有一个名为“ max”的python内置函数可用于执行此操作。
大多数内置函数通常采用一个称为key(> python2.5)的可选参数

In [1]: data = ((1,33),(2,24),(3,42),(4,2),(8,12))
In [2]: max(data, key=lambda (x,y): -1 if x not in range(2,4) else y)
Out[2]: (3, 42)

针对数据中每个项目的函数的返回值执行最大操作
在这种情况下,对于每个(x,y),如果'x'不在range(2,4)范围内,我将返回“ -1” 否则,我将返回“ y”。

max函数负责计算y的最大值

发件人:https://docs.python.org/2/library/functions.html#max

  

可选的key参数指定一个单参数排序函数,例如用于list.sort()的函数。如果提供了key参数,则必须采用关键字形式(例如max(a,b,c,key = func))。