Как найти максимальные и минимальные числа в списке в списке - PullRequest
0 голосов
/ 05 апреля 2020

Я застрял в этом вопросе, где мне необходимо обновить все самые большие и самые маленькие числа в списке со средним значением, чтобы убрать крайние значения из данного списка.

Например:

def remove_extreme( [ [0,4], [1,4], [-1,2] ] ) будет return [ [0,1.5], [1,1.5], [1.5,2] ].

Функция должна будет использовать среднее значение для изменения элементов в списках, что в этом case самые маленькие и самые большие значения -1 и 4 соответственно. Затем все самые большие и самые маленькие значения, присутствующие в списке, необходимо изменить на среднее (среднее) из этих двух значений, которое составляет (4 + -1) / 2 = 1,5

Вот мой код:

def remove_extreme(datalist):
    for numlist in datalist:
        for index, number in enumerate(numlist):
            largest = max(number)
            smallest = min(number)
            average = (largest - smallest)/2
            if number == largest or smallest:
                num_list[index] = average
        return datalist

Могу ли я знать, что пошло не так? Я продолжаю получать объект 'int' не повторяемый.

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Что вы спрашивали о

Чтобы ответить на ваш немедленный вопрос, встроенные функции 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, в которой возникает проблема. , Просто полезный совет!

1 голос
/ 05 апреля 2020

Вы пытаетесь получить максимум и минимум элемента, которого нет в списке

>>> list = ( [ [0,4], [1,4], [-1,2] ] )
>>> max(list)

Вывод [1, 4]

>>> min(list)

Вывод [-1, 2]

...