Min python max: max() and min() in Python
Python. Встроенные функции min( ), max( ). (51) | Самостоятельное изучение Python
Функция min( )
Синтаксис:
Встроенная функция min( )имеет 2а вида синтаксиса:
В первом случае в качестве аргумента передается итерируемый объект:
min(итерируемый_объект, default=значение, функция)
итерируемый_объект – объект поддерживающий итерирование (если коротко то – это такой объект из которого можно сделать итератор, а итератор это такой объект при каждом новом обращении к которому он возвращает свой следующий элемент, а когда элементы заканчиваются возбуждается исключение StopIterator ). Обязательный аргумент.
default=значение – значение возвращаемое в случае если итерируемый_объект – пустой. Необязательный аргумент.
функция – функция с одним аргументом которая применяется к каждому элементу итерируемого_объекта перед поиском наименьшего значения. Необязательный аргумент.
В этом случае функция min( ) возвращает наименьший элемент итерируемого_объекта, в случае если функции min( ) передан аргумент функция, то перед поиском наименьшего элемента эта функция применяется к каждому элементу итерируемого_объекта. В случае если итерируемый_объект – пустой, и есть аргумент default=значение, то возвращается его значение, если аргумента default=значение – нет, то возбуждается исключение ValueError.
Во втором случае в качестве аргумента передаются позиционные аргументы:
min(аргумент1, аргумент2, аргументN,)
аргумент1, аргумент2, аргументN – позиционные аргументы среди которых ищется наименьшее значение.
В этом случае функция min( ) возвращает наименьшее значение позиционных аргументов.
Функция max( )
Синтаксис:
Встроенная функция max( ) имеет 2а вида синтаксиса:
В первом случае в качестве аргумента передается итерируемый объект:
max(итерируемый_объект, default=значение, функция)
итерируемый_объект – объект поддерживающий итерирование (если коротко то – это такой объект из которого можно сделать итератор, а итератор это такой объект при каждом новом обращении к которому он возвращает свой следующий элемент, а когда элементы заканчиваются возбуждается исключение StopIterator ). Обязательный аргумент.
default=значение – значение возвращаемое в случае если итерируемый_объект – пустой. Необязательный аргумент.
функция – функция с одним аргументом которая применяется к каждому элементу итерируемого_объекта перед поиском наибольшего значения. Необязательный аргумент.
В этом случае функция max( ) возвращает наибольший элемент итерируемого_объекта, в случае если функции max( ) передан аргумент функция, то перед поиском наибольшего элемента эта функция применяется к каждому элементу итерируемого_объекта. В случае если итерируемый_объект – пустой, и есть аргумент default=значение, то возвращается его значение, если аргумента default=значение – нет, то возбуждается исключение ValueError.
Во втором случае в качестве аргумента передаются позиционные аргументы:
max(аргумент1, аргумент2, аргументN,)
аргумент1, аргумент2, аргументN – позиционные аргументы среди которых ищется наибольшее значение.
функция – функция с одним аргументом которая применяется к каждому позиционному аргументу перед поиском наибольшего значения. Необязательный аргумент.
В этом случае функция max( ) возвращает наибольшее значение позиционных аргументов.
По ссылкам можно почитать мои конспекты:
Книги и курсы по Python
Книги и курсы по Python год спустя.
Встроенные функции (Built-in)
Методы словаря (Dict methods)
Методы списков (List methods)
Строковые методы (String Methods)
Библиотека os
Спецификаторы
Итерируемый тип данных
Инструкции continue, break и pass
Цикл for … in
Цикл while
Условная инструкция if
Индексация
Переменные
Встроенные функции print() и input()
Оператор присваивания
Основные типы данных
Коротко о языке
алгоритм — Реализация min / max Python
Найти минимум/максимум можно, используя один линейный алгоритм для разных типов ввода: как для списков с числами, так и для строк, так и для списка пар итд:
def min_item(items, *, key=lambda x: x):
min_, *items = items
for item in items:
if key(item) < key(min_):
min_ = item
return min_
Пример:
>>> min_item([2, 1, 3])
1
>>> min_item("aBc")
'B'
>>> min_item([[1,2], [3, 4], [9, 0]], key=lambda x: x[1])
[9, 0]
где синтаксис со звёдочкой, используется, чтобы первый элемент из коллекции достать:
>>> a, *b = [1, 2, 3]
>>> print(a, b)
1 [2, 3]
sorted(items, key=key)[0]
сработало бы для всех представленных случаев, но сортировка, основанная на сравнениях, требует O(n * log n)
операций, поэтому показан простой цикл как пример реализации min()
, используя линейный (O(n)
) алгоритм.
Стандартные min/max функции сложнее представленной min_item()
:
можно передавать несколько аргументов:
>>> min(1, 2, 3) 1
если ввод пустой, то может быть возвращено значение по умолчанию:
>>> min([], default=1) 1
потребляемая память не зависит от количества переданных элементов (в то время как реализация выше, использует
O(n)
дополнительной памяти—чем больше ввод, тем больше памяти требуется)- можно оптимизировать алгоритм, чтобы избежать вызова
key()
несколько раз для одного и того же элемента.
Легко адаптировать min_item()
функцию, чтобы она несколько аргументов поддерживала:
def min_item(first, *args, key=lambda x: x):
if not args: # first is an iterable
first, *args = first
for arg in args:
if key(arg) < key(first):
first = arg
return first
В этом случае, если передан один аргумент (len(args) == 0
и поэтому not args
ветка выполняется), то поведение идентично первому примеру. Если передано несколько позиционных аргументов, то ищется минимум среди них:
>>> min_item(2, 1, 3)
1
>>> min_item([2, 1, 3])
1
>>> min_item("aBc", key=str.lower)
'a'
Чтобы удовлетворить требования к памяти, можно использовать итераторы:
_sentinel = object()
def min(first, *args, key=lambda x: x, default=_sentinel):
if not args: # first is an iterable
args = iter(first)
try:
first = next(args)
except StopIteration: # empty
if default is _sentinel:
raise ValueError("min() arg is an empty sequence") from None
return default
elif default is not _sentinel:
raise TypeError("Cannot specify a default for min() with multiple positional arguments")
min_key = key(first)
for arg in args:
k = key(arg)
if k < min_key:
min_key = k
first = arg
return first
Эта функция ведёт себя как стандартная min()
функция.
_sentinel
используется, чтобы определить был ли передан default
параметр при вызове функции.
key()
функция вызывается только один раз для каждого элемента на входе.
Эта реализация функции min()
поддерживает произвольное (конечное) число входных элементов, не увеличивая потребляемую дополнительную память с ростом ввода.
Пример:
>>> min_(map(len, file)) # длина самой короткой строки в (возможно большом) файле
>>> min_(1, 2, 3)
1
>>> min_(x*x for x in range(-10, 3))
0
>>> min([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
>>> min([], default=1)
1
Реализация max()
крайне похожа—достаточно <
на >
поменять.
python — Как получить минимум и максимум без использования функций min и max?
Я пытаюсь найти максимум и минимум без использования функций min и max. Но максимум показывает только первый номер. Любая помощь?
Мой код:
count = 0
total = 0.0
num = float(input("Enter the number: "))
maximum = num
minimum = num
while num = 0:
count = count + 1
total = total + num
num = float(input("Enter the number: "))
if num < minimum:
minimum = num
else:
num > maximum
maximum = num
if count == 0:
print("Invalid Entry.")
else:
print("Average Number:", round(total/count, 1))
print("Minimum Number:", minimum)
print("Maximum Number:", maximum)
0
TJH
31 Мар 2020 в 16:10
4 ответа
Лучший ответ
Вы не предполагали условие if, поэтому оно не работает
Я изменил код для получения 6 номеров один за другим попробуйте это
count = 0
total = 0.0
num = float(input("Enter the number: "))
maximum = num
minimum = num
while count < 5:
count = count + 1
total = total + num
num = float(input("Enter the number: "))
if num < minimum:
minimum = num
else:
num > maximum
maximum = num
if count == 0:
print("Invalid Entry.
")
else:
print("Average Number:", round(total/count, 1))
print("Minimum Number:", minimum)
print("Maximum Number:", maximum)
1
Dickens A S
31 Мар 2020 в 13:16
Вам нужно проверить минимальное и максимальное для каждого числа. поэтому эта часть должна быть в цикле while:
if num < minimum:
minimum = num
if num > maximum
maximum = num
Кроме того, хотя состояние не кажется правильным. Вы назначаете 0 для num каждый раз. Вы, вероятно, имели в виду num! = 0. в этом случае, когда пользователь вводит 0, программа завершается.
0
Mahshid
31 Мар 2020 в 13:22
Я не совсем уверен, что вы пытаетесь достичь здесь. Если ваш первый ввод отличается от 0, вы установите для максимума и минимума переменных это ненулевое число. Вы пропустите цикл while и оператор if. Если вы не получите сообщение об ошибке, оно, вероятно, просто выдаст максимум и минимум, являющиеся одним и тем же числом. Можете ли вы предоставить более подробную информацию о том, что вы пытаетесь сделать?
0
BigHeadEd
31 Мар 2020 в 13:22
count = 0
total = 0.0
num = None
maximum = -float("inf")
minimum = float("inf")
# No need to do the 1st round outside the loop
while num != 0:
num = float(input("Enter the number: "))
count += 1
total += num # += is more concise
# This block needs to be in the while loop
if num < minimum:
minimum = num
if num > maximum: # elif is fine if you initialize minimum and maximumwith the 1st value of num
maximum = num
if count == 0:
print("Invalid Entry.
")
else:
print("Average Number:", round(total/count, 1))
print("Minimum Number:", minimum)
print("Maximum Number:", maximum)
0
gdelab
31 Мар 2020 в 13:15
60951364
Сортировка по убыванию и возрастанию
Введение
Примеры
Получение минимума или максимума нескольких значений
min(7,2,1,5)
# Output: 1
max(7,2,1,5)
# Output: 7
Использование ключевого аргумента
Нахождение минимума / максимума последовательности последовательностей возможно:
list_of_tuples = [(0, 10), (1, 15), (2, 8)]
min(list_of_tuples)
# Output: (0, 10)
но если вы хотите отсортировать по определенному элементу в каждой последовательности с помощью key
-argument:
min(list_of_tuples, key=lambda x: x[0]) # Сортировка по первому элементу
# Output: (0, 10)
min(list_of_tuples, key=lambda x: x[1]) # Сортировка по второму элементу
# Output: (2, 8)
sorted(list_of_tuples, key=lambda x: x[0]) # Сортировка по первому элементу по возрастанию
# Output: [(0, 10), (1, 15), (2, 8)]
sorted(list_of_tuples, key=lambda x: x[1]) # Сортивровка по второму элементу по возрастанию
# Output: [(2, 8), (0, 10), (1, 15)]
import operator
# Оператор module содержит коэффициенты альтернативные лямбда функции
max(list_of_tuples, key=operator.
itemgetter(0)) # Сортировка по первому элементу
# Output: (2, 8)
max(list_of_tuples, key=operator.itemgetter(1)) # Сортировка по второму элементу
# Output: (1, 15)
sorted(list_of_tuples, key=operator.itemgetter(0), reverse=True) # Reversed (decreasing)
# Output: [(2, 8), (1, 15), (0, 10)]
sorted(list_of_tuples, key=operator.itemgetter(1), reverse=True) # Reversed(decreasing)
# Output: [(1, 15), (0, 10), (2, 8)]
Аргумент по умолчанию для max, min
Вы не можете передать пустую последовательность в max
или min
:
min([])
ValueError: min () arg — пустая последовательность
Однако, с Python 3, вы можете передать в аргументе ключевого слова по default
со значением , которое будет возвращено , если последовательность пуста, а не поднимать исключение:
max([], default=42)
# Output: 42
max([], default=0)
# Output: 0
Особый случай: словари
Получение минимального или максимального или с использованием sorted
зависит от итераций над объектом. В случае
dict
, итерация только по клавишам:
adict = {'a': 3, 'b': 5, 'c': 1}
min(adict)
# Output: 'a'
max(adict)
# Output: 'c'
sorted(adict)
# Output: ['a', 'b', 'c']
Чтобы сохранить словарную структуру, вы должны перебрать .items()
:
min(adict.items())
# Output: ('a', 3)
max(adict.items())
# Output: ('c', 1)
sorted(adict.items())
# Output: [('a', 3), ('b', 5), ('c', 1)]
Для sorted
, можно создать OrderedDict
сохранить сортировку, имея dict
-like структуру:
from collections import OrderedDict
OrderedDict(sorted(adict.items()))
# Output: OrderedDict([('a', 3), ('b', 5), ('c', 1)])
res = OrderedDict(sorted(adict.items()))
res['a']
# Output: 3
Опять же, это возможно с помощью key
аргумента:
min(adict.items(), key=lambda x: x[1])
# Output: ('c', 1)
max(adict.items(), key=operator.itemgetter(1))
# Output: ('b', 5)
sorted(adict.
items(), key=operator.itemgetter(1), reverse=True)
# Output: [('b', 5), ('a', 3), ('c', 1)]
Получение отсортированной последовательности
Используя одну последовательность:
sorted((7, 2, 1, 5)) # tuple
# Output: [1, 2, 5, 7]
sorted(['c', 'A', 'b']) # list
# Output: ['A', 'b', 'c']
sorted({11, 8, 1}) # set
# Output: [1, 8, 11]
sorted({'11': 5, '3': 2, '10': 15}) # dict
# Output: ['10', '11', '3'] # only iterates over the keys
sorted('bdca') # string
# Output: ['a','b','c','d']
Результат всегда новый list
; исходные данные остаются без изменений.
Минимум и максимум последовательности
Получение минимума последовательности (Iterable) является эквивалентом доступа к первому элементу в sorted
последовательностях:
min([2, 7, 5])
# Output: 2
sorted([2, 7, 5])[0]
# Output: 2
Максимум является немного более сложной, потому что sorted
сохраняет порядок и max
возвращает первое значение встречается. В случае отсутствия дубликатов максимум совпадает с последним элементом отсортированного возврата:
max([2, 7, 5])
# Output: 7
sorted([2, 7, 5])[-1]
# Output: 7
Но нет, если есть несколько элементов, которые оцениваются как имеющие максимальное значение:
class MyClass(object):
def __init__(self, value, name):
self.value = value
self.name = name
def __lt__(self, other):
return self.value < other.value
def __repr__(self):
return str(self.name)
sorted([MyClass(4, 'first'), MyClass(1, 'second'), MyClass(4, 'third')])
# Output: [second, first, third]
max([MyClass(4, 'first'), MyClass(1, 'second'), MyClass(4, 'third')])
# Output: first
Любая итерация , содержащие элементы , которые поддерживают <
или >
операции разрешены.
Сделать пользовательские классы заказанными
min
, max
, и sorted
все должны объекты быть упорядочиваема. Для того, чтобы быть правильно упорядочиваема, класс должен определить все 6 методов
__lt__
, __gt__
, __ge__
, __le__
, __ne__
и __eq__
:
class IntegerContainer(object):
def __init__(self, value):
self.value = value
def __repr__(self):
return "{}({})".format(self.__class__.__name__, self.value)
def __lt__(self, other):
print('{!r} - Test less than {!r}'.format(self, other))
return self.value < other.value
def __le__(self, other):
print('{!r} - Test less than or equal to {!r}'.format(self, other))
return self.value <= other.value
def __gt__(self, other):
print('{!r} - Test greater than {!r}'.format(self, other))
return self.value > other.value
def __ge__(self, other):
print('{!r} - Test greater than or equal to {!r}'.format(self, other))
return self.value >= other.value
def __eq__(self, other):
print('{!r} - Test equal to {!r}'.
format(self, other))
return self.value == other.value
def __ne__(self, other):
print('{!r} - Test not equal to {!r}'.format(self, other))
return self.value != other.value
Хотя осуществление всех этих методов может показаться ненужным, опуская некоторые из них сделает ваш код склонной к ошибкам .
Примеры:
alist = [IntegerContainer(5), IntegerContainer(3),
IntegerContainer(10), IntegerContainer(7)
]
res = max(alist)
# Out: IntegerContainer(3) - Test greater than IntegerContainer(5)
# IntegerContainer(10) - Test greater than IntegerContainer(5)
# IntegerContainer(7) - Test greater than IntegerContainer(10)
print(res)
# Out: IntegerContainer(10)
res = min(alist)
# Out: IntegerContainer(3) - Test less than IntegerContainer(5)
# IntegerContainer(10) - Test less than IntegerContainer(3)
# IntegerContainer(7) - Test less than IntegerContainer(3)
print(res)
# Out: IntegerContainer(3)
res = sorted(alist)
# Out: IntegerContainer(3) - Test less than IntegerContainer(5)
# IntegerContainer(10) - Test less than IntegerContainer(3)
# IntegerContainer(10) - Test less than IntegerContainer(5)
# IntegerContainer(7) - Test less than IntegerContainer(5)
# IntegerContainer(7) - Test less than IntegerContainer(10)
print(res)
# Out: [IntegerContainer(3), IntegerContainer(5), IntegerContainer(7), IntegerContainer(10)]
sorted
с reverse=True
, также использует __lt__
:
res = sorted(alist, reverse=True)
# Out: IntegerContainer(10) - Test less than IntegerContainer(7)
# IntegerContainer(3) - Test less than IntegerContainer(10)
# IntegerContainer(3) - Test less than IntegerContainer(10)
# IntegerContainer(3) - Test less than IntegerContainer(7)
# IntegerContainer(5) - Test less than IntegerContainer(7)
# IntegerContainer(5) - Test less than IntegerContainer(3)
print(res)
# Out: [IntegerContainer(10), IntegerContainer(7), IntegerContainer(5), IntegerContainer(3)]
Но sorted
можно использовать __gt__
вместо этого , если по умолчанию не выполняется:
del IntegerContainer.
__lt__ # The IntegerContainer no longer implements "less than"
res = min(alist)
# Out: IntegerContainer(5) - Test greater than IntegerContainer(3)
# IntegerContainer(3) - Test greater than IntegerContainer(10)
# IntegerContainer(3) - Test greater than IntegerContainer(7)
print(res)
# Out: IntegerContainer(3)
Сортировка методов поднимет TypeError
, если ни __lt__
, ни __gt__
реализованы:
del IntegerContainer.__gt__ # The IntegerContainer no longer implements "greater then"
res = min(alist)
Ошибка типа: неупорядоченные типы: IntegerContainer () <IntegerContainer ()
functools.total_ordering
декоратор может использоваться упрощая возможность написания этих богатых методы сравнения. Если вы украшаете свой класс с total_ordering
, вам нужно реализовать __eq__
, __ne__
и только один из __lt__
, __le__
, __ge__
или __gt__
и декоратор заполнит в остальном:
import functools
@functools.
total_ordering
class IntegerContainer(object):
def __init__(self, value):
self.value = value
def __repr__(self):
return "{}({})".format(self.__class__.__name__, self.value)
def __lt__(self, other):
print('{!r} - Test less than {!r}'.format(self, other))
return self.value < other.value
def __eq__(self, other):
print('{!r} - Test equal to {!r}'.format(self, other))
return self.value == other.value
def __ne__(self, other):
print('{!r} - Test not equal to {!r}'.format(self, other))
return self.value != other.value
IntegerContainer(5) > IntegerContainer(6)
# Output: IntegerContainer(5) - Test less than IntegerContainer(6)
# Returns: False
IntegerContainer(6) > IntegerContainer(5)
# Output: IntegerContainer(6) - Test less than IntegerContainer(5)
# Output: IntegerContainer(6) - Test equal to IntegerContainer(5)
# Returns True
Обратите внимание на то, как >
(больше) Теперь заканчивается вызовом меньше , чем метод, а в некоторых случаях даже __eq__
метод. Это также означает, что, если скорость имеет большое значение, вы должны самостоятельно реализовать каждый метод сравнения.
Извлечение N самых больших или N самых маленьких элементов из итерируемого
Для того, чтобы найти некоторое количество (более одного) из больших или мельчайших значений итератора, вы можете использовать nlargest
и nsmallest
из heapq
модуля:
import heapq
# get 5 largest items from the range
heapq.nlargest(5, range(10))
# Output: [9, 8, 7, 6, 5]
heapq.nsmallest(5, range(10))
# Output: [0, 1, 2, 3, 4]
Это гораздо эффективнее, чем сортировка всего итерируемого и затем нарезка с конца или начала. Внутри эти функции используют бинарные кучи приоритетной очереди структуру данных, которая является очень эффективной для этого случая использования.
Как min
, max
и sorted
, эти функции принимают дополнительный key
ключевого слова аргумента, который должен быть функцией , которая, учитывая элемент, возвращает ключ сортировки.
Вот программа, которая извлекает 1000 самых длинных строк из файла:
import heapq
with open(filename) as f:
longest_lines = heapq.nlargest(1000, f, key=len)
Здесь мы открываем файл и передать дескриптор файла f
в nlargest
. Повторение файла дает каждую строку файла как отдельную строку; nlargest
затем проходит каждый элемент (или линия) передается функции len
, чтобы определить его ключ сортировки. len
, учитывая строку, возвращает длину строки в символах.
Это требует только хранилища для списка из 1000 самых больших строк, которые можно сравнить с
longest_lines = sorted(f, key=len)[1000:]
которые должны будут держать весь файл в памяти.
Синтаксис
Параметры
Примечания
Pandas Урок — агрегация и группировка данных (sum, mean, max, min..
Во втором уроке руководства по работе с pandas речь пойдет об агрегации (min, max, sum, count и дргуих) и группировке. Это популярные методы в аналитике и проектах data science, поэтому убедитесь, что понимаете все в деталях!
Примечание: это руководство, поэтому рекомендуется самостоятельно писать код, повторяя инструкции!
Агрегация данных — теория
Агрегация — это процесс превращения значений набора данных в одно значение. Например, у вас есть следующий набор данных…
animal | water_need |
---|---|
zebra | 100 |
lion | 350 |
elephant | 670 |
kangaroo | 200 |
…простейший метод агрегации для него — суммирование water_needs
, то есть 100 + 350 + 670 + 200 = 1320. Как вариант, можно посчитать количество животных — 4. Теория не так сложна. Но пора переходить к практике.
Агрегация данных — практика
Где мы остановились в последний раз? Открыли Jupyter Notebook, импортировали pandas и numpy и загрузили два набора данных: zoo.csv
и article_reads
. Продолжим с этого же места. Если вы не прошли первую часть, вернитесь и начните с нее.
Начнем с набора zoo
. Он был загружен следующим образом:
pd.read_csv('zoo.csv', delimiter = ',')
Дальше сохраним набор данных в переменную zoo
.
zoo = pd.read_csv('zoo.csv', delimiter = ',')
Теперь нужно проделать пять шагов:
- Посчитать количество строк (количество животных) в
zoo
. - Посчитать общее значение
water_need
животных. - Найти наименьшее значение
water_need
. - И самое большое значение
water_need
. - Наконец, среднее
water_need
.
Агрегация данных pandas №1: .count()
Посчитать количество животных — то же самое, что применить функцию count
к набору данных zoo
:
zoo.count()
А что это за строки? На самом деле, функция count()
считает количество значений в каждой колонке. В случае с zoo
было 3 колонки, в каждой из которых по 22 значения.
Чтобы сделать вывод понятнее, можно выбрать колонку animal
с помощью оператора выбора из предыдущей статьи:
zoo[['animal']].count()
В этом случае результат будет даже лучше, если написать следующим образом:
zoo.animal.count()
Также будет выбрана одна колонка, но набор данных pandas превратится в объект series (а это значит, что формат вывода будет отличаться).
Агрегация данных pandas №2: .sum()
Следуя той же логике, можно с легкостью найти сумму значений в колонке water_need
с помощью:
zoo.water_need.sum()
Просто из любопытства можно попробовать найти сумму во всех колонках:
zoo.sum()
Примечание: интересно, как
.sum()
превращает слова из колонкиanimal
в строку названий животных. (Кстати, это соответствует всей логике языка Python).
Агрегация данных pandas №3 и №4: .min() и .max()
Какое наименьшее значение в колонке water_need
? Определить это несложно:
zoo.water_need.min()
То же и с максимальным значением:
zoo.water_need.max()
Наконец, стоит посчитать среднестатистические показатели, например среднее и медиану:
zoo.water_need.mean()
zoo.water_need.median()
Это было просто. Намного проще, чем агрегация в SQL.
Но можно усложнить все немного с помощью группировки.
Группировка в pandas
Работая аналитиком или специалистом Data Science, вы наверняка постоянно будете заниматься сегментациями. Например, хорошо знать количество необходимой воды (water_need
) для всех животных (это 347,72
). Но удобнее разбить это число по типу животных.
Вот упрощенная репрезентация того, как pandas осуществляет «сегментацию» (группировку и агрегацию) на основе значений колонок!
Функция .groupby в действии
Проделаем эту же группировку с DataFrame zoo
.
Между переменной zoo
и функцией .mean()
нужно вставить ключевое слово groupby
:
zoo.groupby('animal').mean()
Как и раньше, pandas автоматически проведет расчеты .mean()
для оставшихся колонок (колонка animal
пропала, потому что по ней проводилась группировка). Можно или игнорировать колонку uniq_id
или удалить ее одним из следующих способов:
zoo.groupby('animal').mean()[['water_need']]
— возвращает объект DataFrame.
zoo.groupby('animal').mean().water_need
— возвращает объект Series.
Можно поменять метод агрегации с .mean()
на любой изученный до этого.
Пришло время…
Проверить себя №1
Вернемся к набору данных article_read
.
Примечание: стоит напомнить, что в этом наборе хранятся данные из блога о путешествиях. Скачать его можно отсюда. Пошаговый процесс загрузки, открытия и сохранения есть в прошлом материале руководства.
Если все готово, вот первое задание:
Какой источник используется в article_read
чаще остальных?
.
.
.
.
.
.
Правильный ответ:
Reddit!
Получить его можно было с помощью кода:
article_read.groupby('source').count()
Взять набор данных article_read
, создать сегменты по значениям колонки source
(groupby('source')
) и в конце концов посчитать значения по источникам (.count()
).
Также можно удалить ненужные колонки и сохранить только user_id
:
article_read.groupby('source').count()[['user_id']]
Проверить себя №2
Вот еще одна, более сложная задача:
Какие самые популярные источник и страна для пользователей country_2
? Другими словами, какая тема из какого источника принесла больше всего просмотров из country_2
?
.
.
.
.
.
.
Правильный ответ: Reddit (источник) и Азия (тема) с 139 прочтениями.
Вот Python-код для получения результата:
article_read[article_read.country == 'country_2'].groupby(['source', 'topic']).count()
Вот краткое объяснение:
В первую очередь отфильтровали пользователей из country_2
(article_read[article_read.country == 'country_2']
). Затем для этого подмножества был использован метод groupby
. (Да, группировку можно осуществлять для нескольких колонок. Для этого их названия нужно собрать в список. Поэтому квадратные скобки используются между круглыми. Это что касается части groupby(['source', 'topic'])
).
А функция count()
— заключительный элемент пазла.
Итого
Это была вторая часть руководства по работе с pandas. Теперь вы знаете, что агрегация и группировка в pandas— это простые операции, а использовать их придется часто.
Примечание: если вы ранее пользовались SQL, сделайте перерыв и сравните методы агрегации в SQL и pandas. Так лучше станет понятна разница между языками.
В следующем материале вы узнаете о четырех распространенных методах форматирования данных: merge
, sort
, reset_index
и fillna
.
max () и min () в Python
В этой статье представлена очень интересная и менее известная функция Python, а именно max () и min (). Теперь по сравнению с их аналогом C ++, который допускает только два аргумента, которые слишком строго являются float, int или char, эти функции не только ограничены 2 элементами , но могут содержать много элементов в качестве аргументов, а также поддерживать строки в их аргументы, что позволяет отображать лексикографически наименьшую или наибольшую строку.Подробное описание функциональных возможностей приводится ниже.
Эта функция используется для вычисления максимального из значений, переданных в ее аргументе, и лексикографически наибольшего значения, если строки передаются в качестве аргументов.
Синтаксис: max (a, b, c, .., ключ, по умолчанию) Параметры: a, b, c, ..: аналогичный тип данных. Ключ : функция ключа , в которой передаются итерации и выполняется сравнение. по умолчанию: значение по умолчанию передается, если данная итерация пуста Возвращаемое значение: Возвращает максимум всех аргументов. Исключений: Возвращает TypeError при сравнении конфликтующих типов.
Python3
|
Выход:
Максимум 4,12,43.3,19 и 100 это: 100
Эта функция используется для вычисления минимального из значений, переданных в ее аргументе, и лексикографически наименьшего значения, если строки передаются в качестве аргументов.
Синтаксис: min (a, b, c, .., ключ, по умолчанию) Параметры: a, b, c, ..: аналогичный тип данных. ключ : ключевая функция, в которой передаются итерации и выполняется сравнение по умолчанию : значение по умолчанию передается, если данная итерация пуста Возвращаемое значение: Возвращает минимум всех аргументов. Исключений: Возвращает TypeError при сравнении конфликтующих типов.
Python3
|
Выход:
Минимум 4,12,43.3,19 и 100 равно: 4
Исключение
1. TypeError: Эти функции выдают ошибку TypeError при сравнении конфликтующих типов данных .
Python3
|
Выход:
Минимум 4,12,43,3,19 и GeeksforGeeks:
Ошибка выполнения:
Traceback (последний звонок последний): Файл "/home/b5da1d7f834a267f94fbbefe1b31a83c.py", строка 7, в print (min (4,12,43,3,19, "GeeksforGeeks")) TypeError: неупорядочиваемые типы: str ()Практическое применение
Одним из практических приложений среди многих является нахождение лексикографически наибольших и наименьших строк i.e Строка, которая появляется первой или последней в словаре.
Python3
(
"Первое слово в слове dict. Среди данных:"
, конец
=
"")
печать
(
мин
(
«компьютерщики»
,
«манжет»
,
«алгоритм»
,
«программирование»
))
(
"Последнее слово в dict.среди заданных: "
, конец
=
" ")
печать
(
макс
(
«гики»
,
«манжет»
,
«алгоритм»
,
«программирование»
))
Выход:
Слово, встречающееся в слове dict. среди данных: алгоритм Слово, встречающееся последним в dict. среди данных: программированиеЭта статья предоставлена Manjeet Singh .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсужденной выше.Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS .
Python max () и min () - поиск max и min в списке или массиве
примеров Python для поиска наибольшего (или наименьшего) элемента в коллекции (например, списке, наборе или массиве) сопоставимых элементов с использованием max ( ) и мин () методов.
1. Функция Python max ()
max () Функция
используется для -
- Вычислить максимальное из значений, переданных в ее аргументе.
- Лексикографически наибольшее значение, если строки передаются в качестве аргументов.
1.1. Найти наибольшее целое число в массиве
>>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] >>> макс (числа) 42 # Максимальное значение в массиве1.2. Найти самую большую строку в массиве
>>> blogName = ["как", "что", "делать", "в", "java"] >>> max (blogName) 'to' # Наибольшее значение в массиве1.3. Найдите максимальный ключ или значение
Немного сложная структура.
>>> price = { 'как': 45,23, 'в': 612,78, 'делать': 205,55, 'in': 37.20, 'java': 10,75 } >>> макс (цены.значения ()) 612,78 >>> max (price.keys ()) # или max (цены). По умолчанию - keys (). 'к'2. Функция Python min ()
Эта функция используется, чтобы -
- вычислить минимум значений, переданных в ее аргументе.
- лексикографически наименьшее значение, если строки передаются в качестве аргументов.
2.1. Найдите наименьшее целое число в массиве
>>> nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] >>> min (числа) -4 # Мин. Значение в массиве2.2. Найти наименьшую строку в массиве
>>> blogName = ["как", "что", "делать", "в", "java"] >>> min (blogName) 'do' # наименьшее значение в массиве2.3. Найдите минимальный ключ или значение
Небольшая сложная структура.
>>> price = { 'как': 45,23, 'в': 612,78, 'делать': 205.55, 'in': 37.20, 'java': 10,75 } >>> min (price.values ()) 10,75 >>> min (price.keys ()) # или min (цены). По умолчанию - keys (). 'делать'Удачного обучения !!
Как использовать функции all, any, max и min в Python
Автор выбрал Фонд помощи COVID-19 для получения пожертвования в рамках программы Write for DOnations.
Введение
Python включает ряд встроенных функций - это глобальные функции Python, которые можно вызывать из любого кода Python без импорта дополнительных модулей.Например, вы всегда можете вызвать встроенную функцию
Некоторые из встроенных функций (
все
,любые
,max
иmin
среди них) принимают итераций значений в качестве своего аргумента и возвращают одно значение. Итерируемый - это объект Python, который можно «повторять», то есть он будет возвращать элементы в последовательности, так что вы можете использовать его в цикледля
. Встроенные функции полезны, когда, например, вы хотите определить, все или какие-либо элементы в списке соответствуют определенным критериям, или найти самый большой или самый маленький элемент в списке.В этом руководстве вы будете использовать встроенные функции
все
,любые
,max
иmin
.Предварительные требования
Чтобы получить максимальную отдачу от этого руководства, рекомендуется иметь:
Использование
все
Встроенная функция
all
проверяет, является ли каждый элемент в итерацииTrue
. Например:все ([True, True])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
TrueВ этом первом примере вы вызываете
все
и даете ему список из двух элементов (два логических значенияTrue
).Поскольку каждый элемент в итерации равенTrue
, результат былTrue
.
все
вернутFalse
, если один или несколько элементов в данной итерации -False
:все ([Верно, Ложно, Верно])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
ЛожьВы вызываете
по всем
со списком, содержащим три элемента, включая одно логическое значениеFalse
.Поскольку одним из элементов в итерации былоFalse
, результат вызоваall
былFalse
.Примечательно, что
all
прекращает итерацию и немедленно возвращаетFalse
, как только встречает первую записьFalse
в итерации. Итак,все
могут быть полезны, если вы хотите проверить последовательные условия, которые могут основываться друг на друге, но возвращать сразу же, как только одно из условий становитсяFalse
.Особый случай, о котором следует помнить, - это когда
всем
дается пустая итерация:все ([])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
TrueКогда вы передаете
all
пустой итерируемый объект (например, пустой список, такой какall ([])
), его возвращаемое значение -True
.Итак,all
возвращаетTrue
, если каждый элемент в итерации имеет значение True или есть 0 элементов.
все
особенно полезны в сочетании с генераторами и индивидуальными условиями. Используя, все
часто короче и лаконичнее, чем если бы вы написали полноценный циклдля
. Давайте рассмотрим пример, чтобы узнать, есть ли в списке элементы, начинающиеся с"s"
:.
животные = [«акула», «тюлень», «морской еж»] все (а.начинается с ("s") для животных)
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
TrueВы вызываете
по всем
с генератором в качестве аргумента. Генератор выдает логическое значение для каждого элемента в спискеживотных
в зависимости от того, начинается ли животное с буквыs
. Окончательное возвращаемое значение -True
, потому что каждый элемент в спискеanimals
начинается сs
.Примечание: Вы можете часто использовать выражения генератора вместо составных частей списков как способ экономии памяти. Например, рассмотрим
все (i <8 для i в диапазоне (3))
ивсе ([i <8 для i в диапазоне (3)])
. Оба оператора возвращаютTrue
, потому что 0, 1, 2 меньше 8. Во втором примере (который использует понимание списка), однако, есть дополнительные накладные расходы, связанные с неявным созданием списка длиной три записи ([True, True, True]
), а затем передать этот список в функциюall
.В первом примере (который использует выражения генератора), напротив, объект-генератор передается в функциюall
, которую функцияall
выполняет итерацию напрямую, без дополнительных затрат на промежуточный список.Учтите, что эквивалентный код, написанный с использованием полноценного цикла
для
, был бы значительно более подробным:животные = [«акула», «тюлень», «морской еж»] def all_animals_start_with_s (животные): для животных: если не a.начинается с ("s"): вернуть ложь вернуть True печать (all_animals_start_with_s (животные))
Без
все
, ваш код для определения того, все ли животные начинаются с буквыs
, требует для реализации еще нескольких строк.Затем вы посмотрите на родственную функцию
все
:любые
.Использование
любое
Вы можете использовать встроенную функцию
any
, чтобы проверить, является ли какой-либо элемент в итерацииTrue
.Например:любой ([False, True])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
TrueВы вызываете
на любом
и передаете ему список из двух элементов (логическое значениеFalse,
и логическое значениеTrue
). Поскольку один или несколько элементов в итерации былиTrue
, на выходе также былоTrue
.
любой
вернетFalse
тогда и только тогда, когда 0 элементов в данной итерации будутTrue
:все ([False, False, False])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
ЛожьВы вызываете
на любом
со списком, содержащим три элемента (всеЛожные,
логические значения).Поскольку 0 элементов в итерации - этоTrue
, выход вызоваany
будетFalse
.Примечательно, что
any
прекращает итерацию и немедленно возвращаетTrue
, как только встречает первую записьTrue
в итерации. Итак,любой
может быть полезен, если вы хотите проверить последовательные условия, но сразу же возвращать, как только одно из условий будетИстинно
.
любой
- как и его родственный методвсе
- особенно полезен в сочетании с генераторами и пользовательскими условиями (вместо полногодля контура
).Давайте рассмотрим пример, чтобы узнать, есть ли в списке элементы, заканчивающиеся на"urchin"
:.
животные = [«акула», «тюлень», «морской еж»] любой (s.endswith ("еж") вместо s у животных)
Вы получите следующий результат:
Выход
TrueВы вызываете
любой
с генератором в качестве аргумента. Генератор выдает логическое значение для каждого элемента в спискеживотных
в зависимости от того, заканчивается ли животное наurchin
.Окончательное возвращаемое значение -True
, потому что один элемент в спискеanimals
заканчивается наurchin
.Примечание: Когда
any
дается пустой итеративный объект (например, пустой список, такой какany ([])
), его возвращаемое значение -False
. Итак,any
возвращаетFalse
, если в итерируемом объекте 0 элементов или все элементы в итерируемом объекте также имеют значениеFalse
.Далее вы рассмотрите еще одну встроенную функцию:
max
.Использование
max
Встроенная функция
max
возвращает самый большой элемент, указанный в ее аргументах. Например:макс ([0, 8, 3, 1])
max
дается список с четырьмя целыми числами в качестве аргумента. Возвращаемое значениемакс.
- это самый большой элемент в этом списке:8
.Результат будет следующий:
Выход
8Если задано два или более позиционных аргумента (в отличие от одного позиционного аргумента с итерируемым),
max
возвращает наибольший из заданных аргументов:макс (1, -1, 3)
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
3
max
дается три отдельных аргумента, самый большой из которых -3
.Итак, возвращаемое значение вызоваmax
-3
.Так же, как
любой
ивсе
,max
особенно полезны, потому что он требует меньше строк для использования, чем эквивалентный код, написанный как полный циклдля
.
max
также может работать с объектами более сложными, чем числа. Например, вы можете использоватьmax
со словарями или другими настраиваемыми объектами в вашей программе.max
может разместить эти объекты с помощью аргумента ключевого словаkey
.Вы можете использовать аргумент ключевого слова
key
для определения настраиваемой функции, которая определяет значение, используемое в сравнениях для определения максимального значения. Например:записей = [{"id": 9}, {"id": 17}, {"id": 4}] max (записи, ключ = лямбда x: x ["id"])
Результат будет следующий:
Выход
{'id': 17}Вы вызываете
max
со списком словарей в качестве входных данных. Вы даете анонимнуюлямбда-функцию
в качестве аргумента ключевого словаkey
.max
вызывает функциюлямбда
для каждого элемента в спискезаписей
и возвращает значение ключа«id»
данного элемента. Окончательное возвращаемое значение - это второй элемент взаписях
:{"id": 17}
. Второй элемент взаписях
имел наибольшее значение«id»
, и поэтому считался максимальным элементом.Обратите внимание, что когда
max
вызывается с пустой итерацией, он отказывается работать и вместо этого вызываетValueError
:макс ([])
Если вы запустите этот код, вы получите следующий результат:
Выход
Traceback (последний вызов последний): Файл "макс.py ", строка 1, вМаксимум([]) ValueError: max () arg - пустая последовательность Вы вызываете
max
с пустым списком в качестве аргумента.max
не принимает это как допустимый ввод и вместо этого вызываетValueError
Exception.
max
имеет аналог под названиемmin
, который вы рассмотрите позже.Использование
мин.
Встроенная функция
min
возвращает наименьший элемент, указанный в ее аргументах.Например:мин ([8, 0, 3, 1])
Вы даете
min
список с четырьмя целыми числами в качестве аргумента. Возвращаемое значениемин.
- это наименьший элемент в этом списке:0
.Результатом будет:
Выход
0Если задано два или более позиционных аргумента (в отличие от одного позиционного аргумента с итерируемым),
min
возвращает наименьший из заданных аргументов:мин (1, -1, 3)
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
-1Вы даете
min
три отдельных аргумента, наименьший из которых --1
.Итак, возвращаемое значение вызоваmin
--1
.Подобно
max
,min
поддерживает аргумент ключевого слова с именемkey
, чтобы вы могли передавать в него объекты более сложные, чем числа. Использование аргументаkey
позволяет использовать функциюmin
с любыми настраиваемыми объектами, которые может определять ваша программа.Вы можете использовать аргумент ключевого слова
key
для определения настраиваемой функции, которая определяет значение, используемое в сравнениях для определения минимального значения.Например:записей = [{"id": 9}, {"id": 17}, {"id": 4}] min (записи, ключ = лямбда x: x ["id"])
Выход
{'id': 4}Вы вызываете
min
со списком словарей в качестве входных данных. Вы даете анонимнуюлямбда-функцию
в качестве аргумента ключевого словаkey
.min
вызывает функциюлямбда
для каждого элемента в спискезаписей
и возвращает значение ключа«id»
данного элемента.Окончательное возвращаемое значение - это третий элемент взаписях
:{"id": 4}
. Третий элемент взаписях
имел уменьшенное значение«id»
, и поэтому считался минимальным элементом.Как и
max
, когда вы вызываетеmin
с пустой итерацией, он отказывается работать и вместо этого вызываетValueError
:мин ([])
Если вы запустите предыдущий код, вы получите следующий результат:
Выход
Traceback (последний вызов последний): Файл "мин.py ", строка 1, вмин ([]) ValueError: min () arg - пустая последовательность Вы вызываете
min
с пустым списком в качестве аргумента.min
не принимает это как допустимый ввод и вместо этого вызываетValueError
Exception.Заключение
В этом руководстве вы использовали встроенные функции Python
все
,любые
,max
иmin
. Вы можете узнать больше о функцияхвсех
,любых
,max
иmin
и других встроенных Python в документации Python.Для получения дополнительной информации о других встроенных модулях Python вы также можете ознакомиться со статьями «Встроенные функции Python 3 для работы с числами», «Как использовать функцию карты Python» и «Как использовать функцию фильтра Python».
Пример встроенной функции Python Min и Max
Python min () - это встроенная функция, которая возвращает наименьшее из всех входных значений. Python max () - это встроенная функция, которая возвращает наибольшее из входных значений. Если метод min () вызывается для итерируемого объекта, он возвращает наименьший элемент из этого итеративного объекта.Если итерируемый объект пуст, возвращается значение по умолчанию, если оно предоставлено. В противном случае возникает исключение ValueError.
Пример функции Python Min и Max
Если функция min () вызывается с несколькими аргументами, она возвращает наименьший из них. То же самое для метода max (), если он вызывается с несколькими аргументами, он возвращает самый большой из них.
См. Синтаксис функции Python min ().
min (iterable [, default = obj, key = func])В приведенной выше функции требуется один аргумент, который является итерируемым объектом.
Давайте посмотрим на следующий пример.
# app.py listA = [18, 19, 21, 22] print ('Наименьшее число из listA:', min (listA)) print ('Наибольшее число из listA:', max (listA))Вывод приведенного выше кода следующий.
Метод Python min и max для String
Давайте рассмотрим сценарий, в котором мы находим минимальное и максимальное значение для объекта String.
Напишите следующий код в файле app.py .
# app.py strA = 'AppDividend' print ('Наименьший символ из strA:', min (strA)) print ('Самый большой символ из strA:', max (strA))Смотрите вывод.
В строке функция min и функция max будут видеть значение ASCII каждого символа на экране.
Чье значение ASCII наибольшее, будет печатать этот символ, а чье значение ASCII наименьшее, будет печатать этот символ.
Несколько аргументов в min и max Функция
Возьмем еще один пример String.
В этой демонстрации мы предоставим несколько аргументов функции min и max и увидим результат.
# app.py strA = 'AppDividend' strB = 'Facebook' strC = 'Amazon' print ('Наименьшая строка:', min (strA, strB, strC)) print ('Самая большая строка:', max (strA, strB, strC))См. вывод.
Причина, по которой Amazon использует наименьшую строку, заключается в том, что значение ASCII для A составляет 65, что является наименьшим значением по сравнению со всеми другими алфавитными символами.
Но и AppDividend также начинается с A. Затем он проверит второй символ из обеих строк.
В случае Amazon это m, а в случае AppDividend - p. Это означает, что p больше, чем , и, следовательно, Amazon имеет самое низкое значение.
Facebook имеет наивысшее значение, потому что F больше A относительно их значений ASCII.
Вы можете найти значение ASCII любого символа, используя функцию ord () в Python.
Наконец, урок по встроенным функциям Python Min и Max с примерами завершен.
Как использовать ключевую функцию в Max () и Min () в Python | Индхумати Челлия | Аналитика Vidhya
4.itemgetter
Оператор - это встроенный модуль, содержащий множество операторов.
itemgetter (n) создает функцию, которая принимает на вход итеративный объект (например, список, кортеж, набор) и извлекает из него n-й элемент.
Согласно документации Python:
оператор. itemgetter ( item )
оператор. itemgetter ( * items )Возвращает вызываемый объект, который извлекает элемент из своего операнда с помощью метода операнда
__getitem __ ()
. Если указано несколько элементов, возвращает кортеж значений поиска. Например:После
f = itemgetter (2)
вызовf (r)
возвращаетr [2]
.После
g = itemgetter (2, 5, 3)
вызовg (r)
возвращает(r [2], r [5], r [3])
.Пример: 1 Нахождение наибольшего / наименьшего элемента в списке кортежей на основе второго элемента в кортеже.
itemgetter () вернет функцию, которая выбирает второй элемент в кортеже.
По умолчанию, если мы не указали ключевую функцию, она будет отсортирована на основе первого элемента в кортеже.
от оператора import itemgetter
l1 = [(1,2,3), (3,1,1), (8,5,3), (3,4,2)]#Finding самый большой / самый маленький элемент в списке кортежей на основе второго элемента в кортеже.
print (max (l1, key = itemgetter (1)))
#Output: (8,5,3)
print (min (l1, key = itemgetter (1)))
#Output :( 3,1,1)Пример 2: Поиск наибольшего / наименьшего элемента в списке словарей на основе ключа (возраста) в словаре.
от оператора import itemgetter
# Создание списка словарей
d1 = [{ 'name' : 'indhu' , 'age' : 30},
{ 'name ': ' karthi ', ' age ': 7},
{' name ': ' sarvesh ', ' age ': 3}]# Поиск наибольшего / наименьшего элемента на основе по ключу (возрасту) в словаре
print (min (d1, key = itemgetter ( 'age' )))
#Output: {'name': 'sarvesh', 'age': 3}
print (max (d1, key = itemgetter ( 'age' )))
#Output: {'name': 'indhu', 'age': 30}Пример: 3 Нахождение наибольшего / наименьший элемент в списке словарей на основе значений словаря
из operator import itemgetter
d = { 'a' : [1,2,3], 'b' : [3,4 , 5], 'c' : [1,1,2]}
print (min (d.values (), key = itemgetter (1)))
#Output: [1, 1, 2]
print (max (d.values (), key = itemgetter (1)))
#Output: [ 3, 4, 5]Как использовать функции Python min () и max () с вложенными списками - dbader.org
Автор: Дэн Бадер - Получайте бесплатные обновления новых сообщений здесь.
Давайте поговорим об использовании функций Python min и max в списке, содержащем другие списки. Иногда это называют вложенным списком или списками списков.
Нахождение минимального или максимального элемента списка списков на основе специфического свойства внутренних списков - обычная ситуация, которая может быть сложной для кого-то, кто плохо знаком с Python.
Чтобы дать нам более конкретный пример для работы, допустим, у нас есть следующий список из элементов, вес пары :
nested_list = [['вишня', 7], ['яблоко', 100], ['анаконда', 1360]]Мы хотим, чтобы Python выбирал минимальный и максимальный элемент на основе веса каждого элемента , хранящегося в индексе 1. Мы ожидаем, что
min
иmax
вернут следующие элементы:
мин. (Nested_list)
должно быть['вишня', 7]
max (nested_list)
должно быть['anaconda', 1360]
Но если мы просто вызовем
min
иmax
из этого вложенного списка, мы не получим ожидаемых результатов.Порядок, который мы получаем, похоже, основан на имени элемента , хранящемся в индексе 0:
>>> мин (вложенный_лист) ['anaconda', 1360] # Не то, что мы ожидали! >>> макс (вложенный_лист) ['вишня', 7] # Не то, что мы ожидали!Хорошо, а почему он выбирает не те элементы?
Давайте на мгновение остановимся и подумаем о том, как функция Python
max
работает внутри. Алгоритм выглядит примерно так:def my_max (последовательность): "" "Возвращает максимальный элемент последовательности" "" если не последовательность: поднять ValueError ('пустая последовательность') максимум = последовательность [0] для позиции по порядку: если элемент> максимум: максимум = элемент максимум возвратаИнтересное поведение здесь можно найти в условии, которое выбирает новый максимум:
, если элемент> максимум:
.Это условие хорошо работает, если последовательность
содержит только примитивные типы, такие как
int
илиfloat
, потому что их сравнение несложно (в том смысле, что оно даст ответ, который мы интуитивно ожидаем; например,3> 2
).Однако, если последовательность
содержит другие последовательности , тогда все становится немного сложнее. Давайте посмотрим на документацию Python, чтобы узнать, как Python сравнивает последовательности:
Объекты последовательности можно сравнивать с другими объектами того же типа последовательности.При сравнении используется лексикографический порядок: сначала сравниваются первые два элемента, и если они различаются, это определяет результат сравнения; если они равны, сравниваются следующие два элемента и так далее, пока не будет исчерпана любая последовательность.
Когда
max
необходимо сравнить две последовательности , чтобы найти «больший» элемент, тогда поведение сравнения Python по умолчанию может быть не тем, что нам нужно .Теперь, когда мы понимаем , почему мы получаем неожиданный результат, мы можем подумать о способах исправить наш код.
Как мы можем изменить поведение сравнения?
Нам нужно указать
max
, чтобы сравнивать элементы иначе.В нашем примере код Python
max
просматривает первый элемент в каждом внутреннем списке (строкаcherry
,apple
илиanaconda
) и сравнивает его с текущим максимальным элементом. Вот почему он возвращаетcherry
как максимальный элемент, если мы просто вызываемmax (nested_list)
.Как сообщить
max
, что нужно сравнивать второй элемент каждого внутреннего списка?Представим, что у нас есть обновленная версия
my_max
под названиемmy_max_by_weight
, которая использует для сравнения второй элемент каждого внутреннего списка:def my_max_by_weight (последовательность): если не последовательность: поднять ValueError ('пустая последовательность') максимум = последовательность [0] для позиции по порядку: # Сравнить элементы по их весу в сохраненных # во втором элементе.если элемент [1]> максимум [1]: максимум = элемент максимум возвратаЭто поможет! Мы видим, что
my_max_by_weight
выбирает максимальный элемент, который мы ожидали:>>> my_max_by_weight (вложенный_лист) ['анаконда', 1360]А теперь представьте, что нам нужно найти максимум различных списков.
Возможно, интересующий нас индекс (или ключ ) не всегда будет вторым элементом. Может быть, иногда это будет третий или четвертый элемент, или нужен будет другой вид поиска.
Разве не было бы замечательно, если бы мы могли повторно использовать большую часть кода в нашей реализации
my_max
? Некоторые его части всегда будут работать одинаково, например, проверка того, была ли функция передана пустая последовательность.Как сделать max () более гибким?
Поскольку Python позволяет нам обрабатывать функции как данные, мы можем извлечь код, выбирая ключ сравнения, в его собственную функцию. Назовем это клавишей функцией . Мы можем писать различные виды ключевых функций и передавать их
my_max
по мере необходимости.Это дает нам полную гибкость! Вместо того, чтобы просто выбрать конкретный индекс списка для сравнения, например, индекс 1 или 2, мы можем указать нашей функции выбрать что-то совсем другое - например, длину имени элемента.
Давайте посмотрим на код, реализующий эту идею:
def identity (x): вернуть х def my_max (последовательность, key_func = None): "" " Вернуть максимальный элемент последовательности. key_func - необязательная функция упорядочивания с одним аргументом."" " если не последовательность: поднять ValueError ('пустая последовательность') если не key_func: key_func = личность максимум = последовательность [0] для позиции по порядку: # Спросите ключевую функцию, какое свойство сравнивать если key_func (элемент)> key_func (максимум): максимум = элемент максимум возвратаВ примере кода вы можете увидеть, как по умолчанию мы позволяем
my_max
использовать ключевую функцию, которую мы назвалиidentity
, которая просто использует весь немодифицированный элемент для сравнения.С идентификатором
в качестве ключевой функции мы ожидаем, что
my_max
будет вести себя так же, какmax
.nested_list = [['вишня', 7], ['яблоко', 100], ['анаконда', 1360]] >>> my_max (вложенный_лист) ['вишня', 7]И мы можем подтвердить, что мы по-прежнему получаем тот же (неверный) результат, что и раньше, что является довольно хорошим признаком того, что мы не испортили реализацию полностью 😃.
Теперь самое интересное - мы собираемся переопределить поведение сравнения, написав
key_func
, который возвращает второй подэлемент вместо самого элемента :def вес (x): вернуть x [1] >>> my_max (nested_list, key_func = вес) ['анаконда', 1360]И вуаля, это максимальный элемент, который мы ожидали получить!
Чтобы продемонстрировать гибкость, которую дал нам этот рефакторинг, вот
key_func
, который выбирает максимальный элемент в зависимости от длины имени элемента:def name_length (x): вернуть len (x [0]) >>> my_max (вложенный_лист, key_func = name_length) ['анаконда', 1360]Есть ли сокращение для этого материала?
Вместо того, чтобы явно определять ключевую функцию с помощью
def
и давать ей имя, мы также можем использовать ключевое слово Pythonlambda
для анонимного определения функции.Это немного укорачивает код (и не создает именованную функцию):my_max (вложенный_лист, key_func = лямбда x: x [1]) >>> ['анаконда', 1360]Чтобы сделать наименования более гладким (хотя и менее выразительным), представьте, что мы сократим
key_func
arg доkey
и получили фрагмент кода, который работает с функциейmax
в ванильном Python.Это означает, что нам больше не потребуется наша собственная повторная реализация функции Python
max
, чтобы найти «правильный» максимальный элемент:# Это чистый, ванильный Python: >>> max (вложенный_лист, ключ = лямбда x: x [1]) ['анаконда', 1360]То же самое работает и для встроенного в Python
min
:>>> min (вложенный_лист, ключ = лямбда x: x [1]) ['вишня', 7]Он работает даже для функции Python
sorted
, что делает концепцию «ключевой функции» действительно ценной в ряде ситуаций, с которыми вы можете столкнуться как разработчик Python :>>> отсортировано (nested_list, key = lambda x: x [1]) [['вишня', 7], ['яблоко', 100], ['анаконда', 1360]]Попробуйте сами
Надеюсь, этот пост вам помог.То, что начиналось с простого вопроса, оказалось немного сложнее, чем вы могли ожидать. Но так часто бывает, когда узнаешь о новых концепциях программирования.
Не стесняйтесь написать мне в Twitter или по электронной почте, если вы где-то застряли. Я буду рад со временем улучшать этот урок 🙂
Как использовать функции Python NumPy mean (), min () и max ()? - Linux Подсказка
Библиотека
Python NumPy имеет множество агрегатных или статистических функций для выполнения различных типов задач с одномерным или многомерным массивом.Некоторые из полезных агрегатных функций: mean (), min (), max (), average (), sum (), median (), percentile () и т. Д. . Использование функций mean (), min () и max () описано в этом руководстве. Функция mean () используется для возврата среднего арифметического значения элементов массива. Среднее арифметическое вычисляется путем деления суммы всех элементов массива на общее количество элементов массива. Если конкретная ось упоминается в функции, тогда будет вычислено среднее значение конкретной оси. max () Функция используется для определения максимального значения из элементов массива или элементов конкретной оси массива. min () Функция используется для определения минимального значения из элементов массива или конкретной оси массива.
Использование функции mean ()
Синтаксис функции mean () приведен ниже.
Синтаксис :
numpy.mean (input_array, axis = None, dtype = None, out = None, keepdims = <нет значения>)
Эта функция может принимать пять аргументов.Цели этих аргументов описаны ниже:
input_array
Это обязательный аргумент, который принимает массив в качестве значения, а среднее значение массива вычисляется этой функцией.
ось
Это необязательный аргумент, и значение этого аргумента может быть целым числом или кортежем целых чисел. Этот аргумент используется для многомерного массива. Если значение оси установлено на 0, тогда функция будет вычислять среднее значение значений столбца, а если значение оси установлено на 1, тогда функция будет вычислять среднее значение значений строки .
d тип
Это необязательный аргумент, который используется для определения типа данных среднего значения.
из
Это необязательный аргумент и используется, когда выходные данные функции необходимо сохранить в альтернативном массиве. В этом случае размер выходного массива должен быть таким же, как и размер входного массива. Значение этого аргумента по умолчанию - Нет .
хранилища
Это необязательный аргумент, и в этом аргументе можно установить любое логическое значение.Он используется для правильной передачи вывода на основе входного массива.
Эта функция возвращает массив средних значений, если значение аргумента out установлено на Нет , в противном случае функция возвращает ссылку на выходной массив.
Пример: использование функции mean ()
В следующем примере показано, как можно вычислить среднее значение одномерного и двумерного массива. Здесь первая функция mean () используется с одномерным массивом целых чисел, а вторая функция mean () используется с двумерным массивом целых чисел.
# import NumPy library
import numpy as np
# Создать одномерный массив
np_array = np.array ([6, 4, 9, 3, 1])
# Распечатать массив и средние значения
print ( "Значения одномерного массива NumPy: \ n", np_array)
print ("Среднее значение одномерного массива: \ n", np.mean (np_array))
# Создать двумерный массив
np_array = np.array ([[5, 3, 5], [5, 4, 3]])
# Распечатать массив и средние значения
print ("\ n Значения двух- размерный массив NumPy: \ n ", np_array)
print (" Средние значения двумерного массива: \ n ", np.среднее (np_array, axis = 0))
Выход :
После выполнения вышеуказанного сценария появится следующий вывод.
Использование функции max ()
Синтаксис функции max () приведен ниже.
Синтаксис :
numpy.max (input_array, axis = None, out = None, keepdims = None, initial = None, где = None)
Эта функция может принимать шесть аргументов. Цели этих аргументов описаны ниже:
input_array
Это обязательный аргумент, который принимает в качестве значения массив, и эта функция определяет максимальное значение массива.
ось
Это необязательный аргумент, и его значение может быть целым числом или кортежем целых чисел. Этот аргумент используется для многомерного массива.
из
Это необязательный аргумент и используется, когда выходные данные функции необходимо сохранить в альтернативном массиве.
хранилища
Это необязательный аргумент, и в этом аргументе можно установить любое логическое значение. Он используется для правильной передачи вывода на основе входного массива.
начальный
Это необязательный аргумент, который используется для установки минимального значения вывода.
где
Это необязательный аргумент, который используется для сравнения элементов массива для определения максимального значения. Значение этого аргумента по умолчанию - Нет .
Эта функция возвращает максимальное значение для одномерного массива или массив максимальных значений для многомерного массива.
Пример: использование функции max ()
В следующем примере показано использование функции max () для определения максимального значения одномерного массива.
# import NumPy library
import numpy as np
# Создать массив NumPy целых чисел
np_array = np.array ([21, 5, 34, 12, 30, 6])
# Найти максимальное значение из массива
max_value = np.max (np_array)
# Вывести максимальное значение
print ('Максимальное значение массива:', max_value)
Выход :
После выполнения вышеуказанного сценария появится следующий вывод.
Использование функции min ()
Синтаксис функции min () приведен ниже.
Синтаксис :
numpy.min (input_array, axis = None, out = None, keepdims = None, initial = None, где = None)
Назначение аргументов этой функции такое же, как и у функции max (), которая была объяснена в части функции max (). Это возвращает минимальное значение входного массива.
Пример: использование функции min ()
В следующем примере показано использование функции min () для определения минимального значения одномерного массива.
# import NumPy library
import numpy as np
# Создать массив NumPy целых чисел
np_array = np.array ([21, 5, 34, 12, 30, 6])
# Найти максимальное значение из массива
max_value = np.max (np_array)
# Вывести максимальное значение
print ('Максимальное значение массива:', max_value)
Выход :
После выполнения вышеуказанного сценария появится следующий вывод.