#python #collections
#python #Коллекции
Вопрос:
Существует ли легкодоступный класс / контейнер / коллекция Python 2.7, который хранит только максимальное и минимальное количество вставленных значений? Пример использования:
arr = Class()
arr.append(1)
arr.append(2)
arr.append(3)
print arr.max(), arr.min()
должен возвращать
3 1
Комментарии:
1. Не существует встроенного контейнера, который хранит только min и max. Зачем вам это нужно? Вероятно, существует лучшее решение для вашей реальной проблемы, например
print min(arr), max(arr)
, где arr — это контейнер любого типа.
Ответ №1:
Я не думаю, что в стандартной библиотеке есть такой, но его легко написать:
class MinMaxCollection:
def init(self, seq = None):
self._minmax = None
if seq is not None:
for elem in seq:
self.add(elem)
def add(self, elem):
if self._minmax is None:
self._minmax = ( elem, elem )
else:
self._minmax = ( min(self._minmax[0], elem), max(self._minmax[1], elem) )
def minmax(self):
if self._minmax is None:
raise ValueError('Empty')
return self._minmax
def min(self):
return self.minmax()[0]
def max(self):
return self.minmax()[1]
Ответ №2:
Ответ №3:
Для чего вам это нужно? Проблема довольно тривиальна для решения, и ее можно решить несколькими способами в зависимости от требований. Если вы хотите сохранить только минимальные и максимальные значения и игнорировать все остальное, что было вставлено, сработает следующее. Это тоже O (1), поскольку вы не сохраняете старые значения. Если вам нужно иметь текущую запись всех значений, у меня был бы отсортирован внутренний массив. Тогда вы можете просто указать head для наименьшего или tail для наибольшего.
class MinMax:
def __init__(self):
self.min = None
self.max = None
def append(self, val):
if self.min is None or self.min > val:
self.min = val
if self.max is None or self.max < val:
self.max = val
def getMin(self):
return self.min
def getMax(self):
return self.max