我正在寻找替代或更简洁的方法来返回三个唯一值的中间值。我现在所拥有的是一个功能:
def middle(x, y, z):
if x > y and x < z:
return x
if y > x and y < z:
return y
return z
还有什么更好的吗?
答案 0 :(得分:8)
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
x < y < z
,而是{{1}},它更具可读性和pythonic。
答案 1 :(得分:3)
使用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
将使用两个中间值的平均值,但您可能需要不同的东西。
答案 2 :(得分:2)
def middle(x, y, z):
return x + y + z - max(x, y, z) - min(x, y, z)
只为了它的乐趣。
答案 3 :(得分:1)
只是为了好玩......
我们并不需要对所有三个值进行排序;我们只需要跟踪整个列表中最大的2个,对吗?
通常,这可能很有用,因此标准库有一种方法可以做到这一点:heapq.nlargest
函数。
def middle(x, y, z):
return heapq.nlargest(2, (x, y, z))[-1]
实际上,堆比排序列表慢得多,所以除非列表非常大(3远不够大),并且需要记住的元素数量非常小(2 / 3rds远不是那么小)这足以让你失望很多。快速测试将显示:
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
所以,不要在这里使用它,而是将它保存在工具箱中,以便下次需要500个中的10个最高分时。
答案 4 :(得分:1)
为了好玩:
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
答案 5 :(得分:0)
您还可以制作某种中值函数,该函数不仅适用于3个值
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]