Должно работать следующее:
def remove_outliers(table):
mx = max(map(max, table))
mn = min(map(min, table))
avg = (mx + mn) / 2
for row in table:
row[:] = [avg if x in (mx, mn) else x for x in row]
# OR
for row in table:
for i, x in enumerate(row):
if x in (mx, mn):
row[i] = avg
max(map(max, table))
: применяет функцию max
к каждой строке в table
и принимает max
всех этих "maxes".
row[:] = ...
: назначение среза. Это мутация объекта row
. Просто row = ...
просто перепривязывает переменную l oop, не затрагивая объект списка, который все еще индексируется с помощью table
.
[avg if x in (mx, mn) else x for x in row]
: общего понимания условного списка. Довольно очевидный.