Перейти к содержимому

Как найти число по середине в питоне

  • автор:

Найти среднее или приближенное к среднему число из списка

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] тоже подошел)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *