Что вы спрашивали о
Чтобы ответить на ваш немедленный вопрос, встроенные функции max
и min
возвращают для вас максимальное и минимальное число из повторяемого.
https://docs.python.org/3/library/functions.html#max
Таким образом, он выдает TypeError
, когда вы передаете ему целое число. Вместо этого запустите его по списку / итерируемому.
Но ваш код имеет больше проблем, чем просто.
Ваше if
утверждение, хотя и синтаксически правильное, вероятно, не то, что вам нужно. Скорее всего, вы хотели сделать это:
if number == largest or number == smallest:
Как указал Томерику, вы хотите поместить свои max
и min
за пределы l oop. Кроме того, вам не нужно возвращать список, так как списки изменчивы, и вы свободно модифицируете его внутри функции.
def remove_extreme(datalist):
for numlist in datalist:
largest = max(numlist)
smallest = min(numlist)
average = (largest - smallest)/2
for index, number in enumerate(numlist):
if number == largest or number == smallest:
numlist[index] = average
return datalist
Что ваша проблема на самом деле спрашивает у вас
Глядя на Ваш первоначальный вопрос. Я думаю, вы немного не в курсе правильного ответа, если ваши списки должны выглядеть так, как вы ответили. Первый намек на то, что ваш ответ показывает только одно из измененных значений, и это не всегда среднее значение внутреннего списка. Возьмите [0, 4]
например. 1.5
- это не среднее значение 0 и 4, но вы должны вернуть его. Кажется, что вы действительно хотите изменить наиболее экстремальное число для каждого внутреннего списка на основе среднего значения всех списков. Взятие среднего числа всех внутренних списков дает 1.66
, так что я точно не уверен в этом, но я думаю, что одно из ваших чисел может быть не равно 1 (я так думаю, потому что 10/6 дает 1,66, а 9 / 6 дает 1,5).
Если все вышеприведенные предположения верны, вы можете рассчитать среднее (обычно это sum/number of elements
), а затем найти самый экстремальный элемент в каждом списке.
Ваша функция должна выглядеть примерно так:
def remove_extreme(datalist):
# sum len of each list to get total number of elements
num_elements = sum([len(numlist) for numlist in datalist])
# sum the sum of each list to get total
sum_elements = sum([sum(numlist) for numlist in datalist])
# calculate average
average = sum_elements/num_elements
# find the most extreme element in each list and perform substitution
for numlist in datalist:
smallest = min(numlist)
largest = max(numlist)
large_diff = abs(largest - average)
small_diff = abs(average - smallest)
num_to_change = largest if large_diff > small_diff else smallest
for index, number in enumerate(numlist):
if number == num_to_change: # Just look at the most extreme number
numlist[index] = average
return datalist # list will be modified, but returning it doesn't hurt either
Запуск этой функции после изменения -1
на -2
:
my_list = [
[0,4],
[1,4],
[-2,2]
]
print("Before: ", my_list)
remove_extreme(my_list)
print("After: ", my_list)
Вывод:
$ python remove_extreme.py
Before: [[0, 4], [1, 4], [-2, 2]]
After: [[0, 1.5], [1, 1.5], [1.5, 2]]
После дальнейших разъяснений
После выяснения того, что вопрос действительно спрашивает вас, ответ еще проще:
def remove_extreme(datalist):
flattened = [i for numlist in datalist for i in numlist] # flatten list for convenience
largest = max(flattened)
smallest = min(flattened)
average = (largest + smallest)/2
# find the most extreme element in each list and perform substitution
for numlist in datalist:
for index, number in enumerate(numlist):
if number == smallest or number == largest:
numlist[index] = average
return datalist # list will be modified, but returning it doesn't hurt either
Лично я чувствую себя так имеет меньше смысла, но, похоже, это то, что вы просите.
Кроме того, при написании вопроса полезно включить трассировку стека или указать указанную строку c, в которой возникает проблема. , Просто полезный совет!