Pure python решения
original_list = [[0.5, 1.4, 2.1, 5.2], [2.3, 3.2, 5.3, 2.1], [1.3, 3.1, 2.1, 5.3]]
def mean_no_max(l):
s, m = 0, float('-inf')
for i in l:
s += i
m = m if m > i else i
return [(s - m) / (len(l) - 1) - m]
print(list(map(mean_no_max, original_list))) # -> [[-3.86], [-2.76], [-3.13]]
Забавный подход с одной итерацией по l
с использованием max()
и sum()
def mean_no_max(l):
s = [0]
def update_sum(x):
s[0] += x
return x
max_value = max(l, key=update_sum)
return (s[0] - max_value) / (len(l) - 1) - max_value
def mean_no_max(l):
class Adder:
def __init__(self, num=0, max_value=float('-inf')):
self.num = num
self.max_value = max_value
def __add__(self, other):
self.num += other
if other > self.max_value:
self.max_value = other
return self
adder = sum(l, Adder())
return (adder.num - adder.max_value) / (len(l) - 1) - adder.max_value