我对Python还是很陌生,试图弄清楚如何使用Python 2中所有现有的内置函数来执行此操作。
我在嵌套元组中有一组数据,并希望在指定的x
范围内获取对应y的最大值。我的x
和y
是指((x1, y1), (x2, y2), ...)
。
例如:
data = ((1,33),(2,24),(3,42),(4,2),(8,12))
我想编写一个代码,以便当我指定x
在2
至4
之间的时间时,我得到y
的最大值,即{{1 }}。
答案 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))。