Класс Python 2.7, который поддерживает только максимальное и минимальное количество вставленных значений

#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:

Проверьте массивы Numpy. Вы можете сделать это с помощью функций amax и amin .

Ответ №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