我正在寻找返回三个唯一值中间值的替代或更简洁的方法。我现在有一个函数:
def middle(x, y, z):
if x > y and x < z:
return x
if y > x and y < z:
return y
return z
还有更好的选择吗?
我正在寻找返回三个唯一值中间值的替代或更简洁的方法。我现在有一个函数:
def middle(x, y, z):
if x > y and x < z:
return x
if y > x and y < z:
return y
return z
还有更好的选择吗?
def middle(x, y, z):
return sorted([x, y, z])[1]
def maximum(x, y, z):
return max([x, y, z])
编辑: 如评论区中abarnert所建议的,替代y>x and x<z
,使用更加通俗易懂、符合Python规范的写法x < y < z
。
Python 3.4版本开始,statistics.median
已被纳入标准库:
import statistics
def middle(x, y, z):
return statistics.median((x, y, z))
使用3.1-3.3版本时,在执行pip install stats
之后:
import stats
def middle(x, y, z):
return stats.median((x, y, z))
我相信针对2.6-2.7版本的回溯正在进行中,但尚未存在。(对于2.5或3.0版本,只需升级即可。)
当然,如果您有4个值,您必须决定“中间”是什么意思;median
将使用两个中间值的平均值,但您可能需要其他不同的东西。
def middle(x, y, z):
return x + y + z - max(x, y, z) - min(x, y, z)
仅仅为了好玩。
middle(1, 2, 1e200)
。 :) - undefined只是为了好玩...
我们不需要对三个值进行排序;我们只需要在遍历整个列表时跟踪最大的两个值,对吧?
一般来说,这很有用,因此标准库有一种方法可以做到这一点:heapq.nlargest
函数。
def middle(x, y, z):
return heapq.nlargest(2, (x, y, z))[-1]
实际上,与对列表进行排序相比,堆要慢得多,因此,除非列表非常大(3远远不够大),需要记住的元素数量非常小(2/3不够小),否则这将使您的速度很慢。通过快速测试可以证明:
In [66]: %timeit heapq.nlargest(2, [1,2,3])[1]
100000 loops, best of 3: 2.78 us per loop
In [67]: %timeit sorted([1,2,3])[1]
1000000 loops, best of 3: 770 ns per loop
为了好玩:
def middle(x, y, z):
if x < y:
if y < z:
return y
elif x < z:
return z
else:
return x
else:
if x < z:
return x
elif y > z:
return y
else:
return z
def median(list):
list = sorted(list)
if len(list) % 2 == 0:
n = len(list)//2
return (list[n]+list[n-1])/2
else:
return list[len(l)//2]
if y < x < z:
。这样更容易阅读,也更不容易出错。(在这种情况下,甚至有一个更简单的答案,所以我只是将其作为注释而不是答案留下来。) - undefinedx < y < z
比y>x and x<z
更好——即使像我或者你这样的白痴也不会搞错。 - undefinedmiddle(2, 3, 1)
返回1
。实际上,无论是x > y and x < z
还是x > z and x < y
都会使x
成为中间值。 - undefined