Найти среднее или приближенное к среднему число из списка
lambda num: abs(num — avg) это функция, которая выражает понятие «приближённое к среднему» — чем это значение меньше тем ближе к среднему (при нуле совпадает со средним). Можно имя этой функции дать:
def distance(a, b): return abs(a - b)
Если представить, что точки лежат на линии, то distance возвращает Евклидову метрику — длину отрезка между точками. Именно поэтому используется abs() функция, которая возвращает абсолютное значение: abs(5 — 11) == abs(17 — 11) == 6 в данном случае, числа 5 и 17 на одном расстоянии от среднего 11 .
min(list_nums, key=lambda num: distance(num, avg))
min() возвращает такое число из list_nums списка, которое ближе всего к avg находится по метрике, определяемой distance() .
- Зачем нужны Lambda-функции?
- Как работают lambda-функции?
- Реализация min / max Python
statistics.mean(L) является более точной по сравнению с наивной sum(L)/len(L) формулой, если вы хотите числа с плавающей точкой поддерживать:
>>> list_nums = [1e50, 1, -1e50] * 1000 >>> sum(list_nums) / len(list_nums) 0.0 >>> statistics.mean(list_nums) 0.3333333333333333
statistics.mean() не так работает, но для примера было бы достаточно: math.fsum(list_nums) / len(list_nums) .
Медиана
Медиана набора чисел — это число, которое находится в середине этого набора, если его упорядочить по возрастанию. То есть такое число, что половина из элементов набора не меньше него, а другая половина не больше.
Напишите функцию, которая будет принимать отсортированный список чисел и возвращать медиану. Если число дробное, его нужно округлить до десятых.
Примеры
median([1, 2, 4, 5, 6, 8, 8, 8, 10]) ➞ 6 median([2, 2, 6, 8, 8, 10, 10]) ➞ 8 median([1, 2, 2, 4, 7, 8, 9, 10]) ➞ 5.5
Варианты решения
def median(nums): m = len(nums) // 2 return (nums[-(m + 1)] + nums[m]) / 2
import statistics def median(nums): return statistics.median(nums)
def median(nums): count = len(nums) median = (nums[count // 2] + nums[(count - 1) // 2]) / 2 return round(median, 1)
Срезы — Python: Списки
Работать с одиночными элементами вы уже умеете. Настало время перейти к очень интересному инструменту, который Python предоставляет для работы с целыми подмножествами элементов списка: к так называемым срезам (slices).
Синтаксис описания срезов
Срезы встроены в язык и снабжены своим собственным синтаксисом — настолько широко они используются. Срез записывается так же, как записывается обращение к элементу списка по индексу:
some_list[START:STOP:STEP]
Всего у среза три параметра:
- START — индекс первого элемента в выборке
- STOP — индекс элемента списка, перед которым срез должен закончиться. Сам элемент с индексом STOP не будет входить в выборку
- STEP — шаг прироста выбираемых индексов
Математически говоря, во множество будут входить индексы элементов, которые будут выбраны:
Например, срез [3:20:5] означает выборку значений с индексами 3, 8, 13 и 18.
При этом любой из трех параметров среза может быть опущен и вместо соответствующего параметра будет выбрано некое значение по умолчанию:
- Умолчательный START означает «от начала списка»
- Умолчательный STOP означает «до конца списка включительно»
- Умолчательный STEP означает «брать каждый элемент»
Вот несколько примеров с разными наборами параметров:
- [:] или [::] — весь список
- [::2] — нечетные по порядку элементы
- [1::2] — четные по порядку элементы
- [::-1] — все элементы в обратном порядке
- [5:] — все элементы, начиная с шестого
- [:5] — все элементы, не доходя до шестого
- [-2:1:-1] — все элементы от предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг
Срезы могут работать в двух режимах: собственно выборка и присваивание.
Выборка элементов
Срезы-выборки работают со списками, кортежами, строками. Результатом применения выборки всегда становится новое значение соответствующего типа — список, кортеж, строка:
'hello'[2:] # 'llo' (1, "foo", True, None)[2:] # (True, None) [1, 2, 3, 4, 5][2:] # [3, 4, 5]
Сразу сделаем несколько замечаний по использованию выборок:
- Кортежи чаще всего содержат разнородные элементы, поэтому срезы для них менее полезны, чем распаковка и перепаковка: тяжело удерживать в голове типы элементов вместе с индексами
- При выборке по срезу [:] создается новая копия списка, поэтому именно так обычно список и копируют
- Срез порождает новый список или кортеж, но для каждого выбранного элемента копируется только ссылка
Присваивание срезу
В отличие от строк и кортежей списки могут изменяться по месту. Одним из вариантов модификации является присваивание срезу. Срезу с указанным шагом можно присвоить список, содержащий соответствующее количество новых элементов:
l = [1, 2, 3, 4, 5, 6] l[::2] = [0, 0, 0] print(l) # => [0, 2, 0, 4, 0, 6]
Если вы попробуете присвоить срезу с шагом неверное количество элементов, то получите ошибку:
l = [1, 2, 3, 4] l[::2] = [5, 6, 7] # Traceback (most recent call last): # File "", line 1, in # ValueError: attempt to assign sequence of size 3 to extended slice of size 2
Если срез непрерывный, то есть шаг не указан и индексы идут подряд, то свободы нам дается больше. Такому срезу можно присвоить как больше элементов — тогда список вырастет, так и меньше, что приведет к урезанию списка:
l = [1, 2, 3] l[2:] = [4, 5] print(l) # => [1, 2, 4, 5] l[1:-1] = [100] print(l) # => [1, 100, 5] l[:] = [] print(l) # => []
Сначала список растет, потом уменьшается, а под конец вообще становится пустым — и все с помощью компактного, но мощного синтаксиса срезов.
Срезы-значения
Хоть срезы и имеют специальную поддержку со стороны синтаксиса, но мы можем создавать и использовать срезы сами по себе — как обычные значения.
Значение среза можно сконструировать с помощью функции slice :
first_two = slice(2) each_odd = slice(None, None, 2) print(each_odd) # => slice(None, None, 2) l = [1, 2, 3, 4, 5] print(l[first_two]) # => [1, 2] print(l[each_odd]) # => [1, 3, 5]
Функция slice принимает от одного до трех параметров — те самые START , STOP и STEP . При вызове функции с одним параметром, функция вызывается с параметром STOP .
Если вы хотите пропустить один из параметров, то подставьте вместо него None . Также None можно использовать и в записи срезов в квадратных скобках — там он так же будет означать пропуск значения.
На месте параметров среза могут быть любые выражения, лишь бы эти выражения вычислялись в целые числа или None .
Соотношение START и STOP
В срезе элемент с индексом STOP не попадает в выборку, в отличие от элемента с индексом START .
У такого поведения есть одна особенность. Какой бы неотрицательный индекс n мы ни выбрали, для любого списка будет соблюдаться указанное равенство:
l == l[:n] + l[n:]
Посмотрим на такой пример:
s = 'Hello!' print(s[:2] + s[2:]) # => 'Hello!' print(s[:4] + s[4:]) # => 'Hello!' print(s[:0] + s[0:] == s) # => True print(s[:100] + s[100:] == s) # => True
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Нахождение среднего числа в массиве Python?
Помогите. Да я знаю для кого-то вопрос покажется легким, но я новичек в программировании, да и питонку изучаю только 1-й день. Но мне интересно многое. Я решил реализовать такое вот задание:
Например, всего элементов в массиве 7, и я хочу реализовать, чтобы средний элемент, тобиж 4 выводился (да, я знаю, что отсчёт элементов массива с нуля, но здесь я 4 указал, чтобы было понятно).
Собственно, до 9 элементов, всё нормально работает, но после 10 элемента — беда.
Код:
my_list=[] n = int(input('Введи число для массивов: ')) for i in range(n): el = int(input("Введи: ")) my_list.append(el) if(n%2 != 0): av = n - (n/2) a = int(round(av)) average = my_list[a] print(average, a+1) #Т.к. отсчёт с нуля, я решил в принте прибавить еденицу для того чтобы было понятно else: print('Вы ввели четное кол-во') input()
- Вопрос задан более трёх лет назад
- 4985 просмотров
Комментировать
Решения вопроса 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
average = sum(my_list) / len(my_list)
from statistics import mean average = round(mean(my_list))
P.S. Изучение лучше начинать с чтения учебника.
Ответ написан более трёх лет назад
Нравится 2 4 комментария
Wiget @Wiget Автор вопроса
Так это нахождение ср. арифм., а мне надо, чтобы находило среднее значение массива. Если 7 элементов, то должен выводит 4 элемент и т.п.
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Wiget, ещё того проще — my_list[len(my_list)//2]
Wiget @Wiget Автор вопроса
from statistics import mean average = round(mean(my_list))
Вот это подошло. Огромное спасибо. Так я и учебники читаю, но любопытство берет вверх 🙂
Да и my_list[len(my_list)//2] тоже подошел)